使用继承时,对象的初始化过程
来源:互联网 发布:vb基础代码 编辑:程序博客网 时间:2024/06/06 02:02
在java中使用继承时对象的初始化过程与新建对象略有不同:
class Insect{private int i=printInit("static insect.i initialized");;protected int j;public static int m=printInit("static insect.m initialized");Insect(){System.out.println("i="+i+", j="+j);j=39;}private static int x1=printInit("static Insect.x1 initialized");static int printInit(String s){System.out.println(s);return 47;}}public class Beatle extends Insect{private int k=printInit("Beatle.k initialized");public Beatle(){System.out.println("k="+k);System.out.println("j="+j);}private static int x2=printInit("static beetle.x2 initialized");public static void main(String[] args){System.out.println("hello world constructor");Beatle h=new Beatle();}}
上述代码运行结果为:
static insect.m initializedstatic Insect.x1 initializedstatic beetle.x2 initializedhello world constructorstatic insect.i initializedi=47, j=0Beatle.k initializedk=47j=39
由此可以看出整个初始化过程应当为:
1. 编译器首先试图访问Beatle.main(),当编译器发现这是一个static方法并且初次被调用时便开始查找Beetle.class的源代码,在此过程中发现Beetle有一个基类于是便开始查找并加载Insect的代码,如果Insect仍有基类那么该过程将持续进行;
2. 代码完成以后便开始依次序对基类中的static成员进行初始化,然后是对子类中的static成员进行初始化;
3. 由于未创建对象,此时不会执行非static成员的初始化以及构造函数的调用,程序继续运行下一个语句,输出:hello world constructor
4. 下一条语句中执行了创建新对象,于是按照基类非static成员初始化→基类构造函数→子类非static成员初始化→子类构造函数的过程完成整个初始化;
总之,就是java中的文件只在使用时才进行加载;当初次创建对象或者调用static域以及static方法时,编译器会完成文件的加载以及static成员的初始化,加载顺序自顶向下;当创建新对象时,编译器会自顶向下的依次完成父类以及子类的初始化。
0 0
- 使用继承时,对象的初始化过程
- 使用继承时,子类对象的初始化过程
- 对象的初始化、继承时,对象的初始化过程、关于构造方法、抽象类……
- 对象初始化过程和关于继承方面的自我总结
- 继承、super、复写、final、对象初始化过程
- 继承类初始化的过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象的初始化过程
- 对象及继承的初始化
- 自信可改变未来,问谁又能做到
- unity随笔-3
- 常见浏览器兼容性问题与解决方案
- 主成分分析降维(MNIST数据集)
- 文件存储读写与动态添加控件结合
- 使用继承时,对象的初始化过程
- 使用 C# 编写简易 ASP.NET Web 服务器
- Graph——bfs,dfs
- 【解决方案】去掉谷歌浏览器获取焦点时默认的input、textarea的边框和背景
- 关于Qwt图像处理的方法心得
- Swift 常用第三方库持续整理
- Android中CS域和PS域以及手机中常用术语简介
- Jmeter对于请求参数封装及使用
- [HDU] I Hate It [线段树]