博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
阅读量:4069 次
发布时间:2019-05-25

本文共 925 字,大约阅读时间需要 3 分钟。

(1)子类A继承父类B, A a = new A(); 则:

父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数

(2)若子类构造函数中显式的调用了父类的某构造函数,则调用该构造函数

class C {
C() { System.out.print("C"); }}class A {
C c = new C(); A() { this("A"); System.out.print("A"); } A(String s) { System.out.print(s); }}class Test extends A {
Test() { super("B"); System.out.print("B"); } public static void main(String[] args) { new Test(); }}

CBB

首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super(“B”)显示的调用了父类的带参构造。执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为:
先调用C类的无参构造
再调用A类的带参构造
最后调用调用子类的构造

(3)在JVM调用mian方法之前先用进行静态内容的初始化。顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。

public class Test{    static int cnt = 6;    static{        cnt += 9;    }public static void main(string[] args){    System.out.println(“cnt =” + cnt);}static{    Cnt /=3;    };}

Cnt=5

转载地址:http://yqaji.baihongyu.com/

你可能感兴趣的文章
Window
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
2. Add Two Numbers
查看>>
17. Letter Combinations of a Phone Number (DFS, String)
查看>>
93. Restore IP Addresses (DFS, String)
查看>>
19. Remove Nth Node From End of List (双指针)
查看>>
49. Group Anagrams (String, Map)
查看>>
139. Word Break (DP)
查看>>
23. Merge k Sorted Lists (Divide and conquer, Linked List) 以及java匿名内部类
查看>>
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>
剑指_栈的压入弹出序列
查看>>
剑指_复杂链表的复制
查看>>
服务器普通用户(非管理员账户)在自己目录下安装TensorFlow
查看>>
星环后台研发实习面经
查看>>
大数相乘不能用自带大数类型
查看>>
字节跳动后端开发一面
查看>>
CentOS Tensorflow 基础环境配置
查看>>