从昨天开始转到尚学堂300集的学习
1.对象和类
类:class。对象:Object,instance(实例)。
某个类的对象 = 某个类的实例
2.面向对象的内存分析
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。
1.栈
-
栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
-
JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
-
栈属于线程私有,不能实现线程间的共享
-
栈的存储特性是“先进后出,后进先出”
-
栈是由系统内存自动分配,速度快!栈是一个连续的内存空间!
2.堆
-
堆用于存储创建好的对象和数组(数组也是对象)
-
JVM只有一个堆,被所有线程共享
-
堆是一个不连续的内存空间,分配灵活,速度慢!
3.方法区(又叫静态区)
-
JVM只有一个方法区,被所有线程共享
-
方法区实际也是堆,只是用于存储类、常量相关的信息
-
用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
public class Student {
String name;
int age;
Computer c;
void sleep() {
System.out.println("我在睡觉!");
}
void eat() {
System.out.println("我在吃饭!" + c.brand);
}
void study() {
System.out.println("我在学习!");
}
Student() {
}
public static void main(String[] args) {
Student st = new Student();
Computer c = new Computer();
c.brand = "惠普";
st.c = c;
st.sleep();
st.eat();
st.study();
}
}
class Computer {
String brand;
}
3.构造方法
构造器也叫构造方法(constructor),用于对象的初始化。
构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。
构造器的名称应与类名一致。
Java通过new关键字来调用构造器,从而返回该类的实例。
声明格式:
[修饰符] 类名(参数列表){
//n条语句
}
注意:
-
通过new关键字调用
-
构造器虽然有返回值,但不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值
-
如果没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义,则编译器不会自动添加
-
构造器的方法名必须和类名一致
4.垃圾回收机制(Garbage collection)
内存管理:
-
Java的内存管理主要指对象的管理,包括对象空间的分配和释放
-
对象空间的分配:使用new关键字创建对象即可
-
对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有“不可达”对象的内存空间
垃圾回收过程:
-
任何一种垃圾回收算法一般要做两件基本事情:
-
发现无用的对象
-
回收无用对象占用的内存空间
-
-
垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的是没有任何变量引用该对象。Java的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。
通用的分代垃圾回收机制:
不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采用不同的回收算法,以便提高回收效率。
我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为Eden、Survivor、Tenured/Old空间。
-
新创建的对象,绝大多数都会存储在Eden中;
-
当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区;
-
Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空;
-
重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中;
-
当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)。
5.this关键字
对象创建的过程:
-
分配对象空间,并将对象成员变量初始化为0或空
-
执行属性值的显示初始化
-
执行构造方法
-
返回对象的地址给相关的变量
this的本质是“创建好的对象的地址”!
由于在构造方法调用前,对象已经创建,因此,在构造方法中也可以用this代表“当前对象”。
this不能用于static方法中。
6.static关键字
在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
-
为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
-
对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!
-
一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化0访问静态成员)。
-
在static方法中不可直接访问非static的成员
核心要点:
static修饰的成员变量和方法,从属于类。
普通变量和方法从属于对象。
7.参数传递机制
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。
-
传递的是值的副本。副本改变不会影响原件。
-
引用类型参数的传值