构造器即构造方法,用于对象的初始化。
-
通过new关键字调用!
-
构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值。
-
如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加!
-
构造器的方法名必须和类名一致!
构造方法的重载(创建不同对象),使用与普通方法重载一致。
public class User {
int id; // id
String name; // 账户名
String pwd; // 密码
public User() {}
public User(int id, String name) {
super(); //构造方法的第一步总是super(),不显式写出,运行时也会自动添加
this.id = id; //this表示创建好的对象
this.name = name;
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public static void main(String[] args) {
User u1 = new User();
User u2 = new User(101, “高小七”);
User u3 = new User(100, “高淇”, “123456”);
}
}
垃圾回收机制:
C++无垃圾回收机制。
Java垃圾回收过程:发现无用对象;回收无用对象占用的内存空间。
无用对象指没有任何变量引用该对象。
垃圾回收相关算法: -
引用计数法
堆中每个对象都有一个引用计数,被引用一次,计数加1,被引用变量值为null,计数减1,若减到0,则表示为无用对象。该算法无法识别循环引用的无用对象。 -
引用可达法(根搜索算法)
程序把所有引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到该节点后,继续寻找引用节点,当所有节点寻找完毕后,剩余节点则为无用节点。
通用分代垃圾回收机制:
对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为Eden、Survivor和Tenured/Old空间。
垃圾回收过程:
1、 新创建的对象,绝大多数都会存储在Eden中,
2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,
然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区
3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,
同时将Eden区中的不能清空的对象,也复制到S2,保证Eden和S1,均被清空。
4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,
5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)
JVM调优主要是对FULL GC的调节,以下情况可能导致FULL GC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显式调用(程序建议GC启动,不是调用GC)
4.上一次GC之后Heap的各域分配策略动态变化
对象创建的过程和this关键字:
this代表当前方法所在的对象。
创建一个对象:
- 分配对象空间,并进行对象成员变量初始化,初始化为0或空;
- 执行属性的显式初始化;
- 执行构造方法;
- 返回对象的地址给相关变量。
this的本质是“创建好的对象的地址”。在构造方法调用前,对象已经创建。因此构造方法中也可以使用this代表当前对象。
this最常的用法: - 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
- 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
- this不能用于static方法中。static方法存于方法区,方法区也存有类信息,而无对象信息,调用this无法找到当前对象。
static关键字:
在类中,static声明的成员方法为静态成员变量,也称类变量,生命周期与类相同,在整个程序执行期间都有效。
static修饰的成员方法从属于类,普通成员方法从属于对象。
静态方法中可以使用静态变量和静态方法,普通方法中不能使用静态变量、调用静态方法。
静态初始化块:构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
静态初始化块执行顺序:
1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
2. 构造方法执行顺序和上面顺序一样。