JAVA--继承与初始化

当我们创建一个类的对象的时候会发生以下事情:类的加载,初始化静态变量,对象的创建。

加载策略:

当我们创建某个对象的时候,加载器会加载其类文件,当加载器注意到该类有其父类,即该类继承自其他类,加载器会继续向上加载其父类,直到找到其祖先。

初始化策略:

当我们加载到根基类之后,根基类的static变量开始初始化,然后是下一个导出类,对其static变量进行初始化,接着以此类推,直到要创建的对象类为止。

对象的创建:

至此为止,必要的类都已经加载完毕,对象就可以开始创建了,首先,对象中的基本类型都会被设为默认值,而对象引用会被设置为null(这是通过对象内存设置为二进制零值而一举生成的),然后,根基类的构造器会被调用,对变量进行初始化,接着会调用导出类的构造器,直到创建对象完成。

对象的销毁:

通过组合和继承方法来创建新类的时候,永远不不必担心对象的清理问题,子对象通常都会留给垃圾回收器进行清理,如果遇到清理的问题,那如果某一个子对象依赖于其他对象,所以销毁的顺序应该与创建的顺序相反,这样当我们销毁某一个对象的时候不必考虑出现异常。


总结起来,对象的创建分为:向上加载,向下初始static,向外构造,向内销毁

类A:

package MainPackage;

/**
 * Created by no_clay on 2017/1/17.
 */
public  class A{
    private static String a = null;
    public A() {
        System.out.println("Construct A");
    }
    static {
        a = "init a";
        System.out.println("The String a init as " + a);
    }
}

类B extends 类B:

package MainPackage;

/**
 * Created by no_clay on 2017/1/17.
 */
public class B extends A {

    private static String b = null;

    public B() {
        System.out.println("Construct B");
    }

    static {
        b = "init b";
        System.out.println("The String b init as " + b);
    }
}

类C extends 类B:

package MainPackage;

/**
 * Created by no_clay on 2017/1/17.
 */
public class C extends B {

        private static String c = null;
        public C() {
            System.out.println("Construct C");
        }
        static {
            c = "init c";
            System.out.println("The String c init as " + c);
        }

}
测试类:

public class Test {
    public static void main(String[] args) {
        new C();
    }
}

输出结果:

"C:\Program Files\Java\jdk1.8.0_112\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=F:\IntelliJ IDEA Community Edition 2016.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_112\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\rt.jar;D:\ThoughtCode\Java-project\GoForIt\out\production\GoForIt;F:\IntelliJ IDEA Community Edition 2016.3.2\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain MainPackage.Test
The String a init as init a
The String b init as init b
The String c init as init c
Construct A
Construct B
Construct C


Process finished with exit code 0


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值