java基础-对象的初始化和清除

本文详细探讨了Java中构造器的使用规则,包括构造器的重载、初始化顺序以及静态关键字的应用。同时,介绍了垃圾回收机制的工作原理,如停止-复制和标记-清除策略。此外,还讲解了成员变量的初始化和静态块的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始化

构造函数

父类如果只有一个有参构造函数 子类也必须有有参构造函数

父类如果有一个无参构造函数,一个有参构造函数 子类默认有一个无参构造函数

构造器和类名必须相同

方法重载 适用于构造器

方法重载:参数个数或者不同参数类型顺序不同

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值