初始化
构造函数
父类如果只有一个有参构造函数 子类也必须有有参构造函数
父类如果有一个无参构造函数,一个有参构造函数 子类默认有一个无参构造函数
构造器和类名必须相同
方法重载 适用于构造器
方法重载:参数个数或者不同参数类型顺序不同
public void f1(String s, int i) {}
public void f1(int i, String s) {}
public void f1(String s, int i) {}
public String f1(int i, String s) {
return "";
}
返回值不同 但是参数顺序及个数也不能相同 以下不能成立
public void f1(int i, String s) {}
public String f1(int i, String s) {
return "";
}
static关键字
this不能访问static方法或者属性 初始化首先初始化static 在初始化构造器
staitc内部不能访问非static的 反之可以 (初始化顺序有关系)
static是类的属性或者方法 和对象无关系
在构造器中创建构造器 用this 且在第一行 如果用父类构造器创造对象用super 且也在第一行
清理对象:
两个重要概念:垃圾回收器 、垃圾回收
在什么时候开始垃圾回收:内存用尽时 才会主动进行清理 如果jvm并未面临内存耗尽的情况,他不会浪费时间去执行垃圾回收的
finalize() 调用它 不一定被回收 垃圾回收只与内存有关
finalize是Object的方法 如果调用它 需要对象重写方法 且调用system.gc()使用
引用计数:未被应用于任何虚拟机中 缺点:一直作用于整个生命周期 还有相互引用的问题
什么是垃圾:清理的是堆中的内存数据 堆中的数据是被[堆栈]和[静态存储区]引用,如果都没有引用 则认为这个对象是垃圾对象
自适应的垃圾回收技术:停止-复制
先停止程序,根据[堆栈]和[静态存储区]引用把活的对象复制到新的堆空间中去,没有被复制的对象就是垃圾对象全部清理掉,新的内存空间是紧凑排列,创建对象按照新的地址就可以放进来了。老的引用全部映射成为新的内存地址。
只会产生少量垃圾的时候 用标记-清除
原因:程序趋于稳定 会造成很少的垃圾,停止复制 就会浪费很多性能。
过程:[堆栈]和[静态存储区]中找到引用标记成活的对象,其他对象进行清除。这时候内存空间不是连续的
成员初始化
如果是对象的属性 new Object时 会给成员变量初始化为0或者null
如果是方法内部的变量 必须显示的赋值 才能参与运算。
构造器初始化
初始化顺序:
1:如果子类继承父类 先初始化父类构造器 再初始化子类构造器
A extends B 先出示话B 再初始化A
2: 如果有其他对象实例化 则先初始化父类 再进行属性初始化 再是自己的构造器
class A {
A() {System.out.println("A");}
}
class C {
C() {System.out.println("C");}
}
public class B extends A {
private C ww = new C();
B() {System.out.println("B");}
}
public static void main(String[] args) {
B b = new B();
}
//结果 A,C,B
有static方法修饰之后的执行顺序
class A {
static {
System.out.println("static A");
}
A() {
System.out.println("A");
}
}
class C {
static {
System.out.println("static C");
}
C() {
System.out.println("C");
}
}
public class B extends A {
static {
System.out.println("static B");
}
private C ww = new C();
B() {
System.out.println("B");
}
}
public static void main(String[] args) {
B m = new B();
}
//结果:
static A
static B
A
static C
C
B