Java类加载问题:变量初始化顺序
2016-03-04 10:46
405 查看
昨天看到一个简单的问题:父类和子类有同样名称的私有变量,在父类构造器中执行打印变量的方法,同时在子类中覆盖这个方法,这时候打印的变量值不是父类和子类的变量值而是变量的默认初始化值。
输出结果:
class classLoad.ChildClass , child 's num = 0
class classLoad.ChildClass , child 's num = 999
原因是:
在创建一个ChildClass对象实例时,在执行ChildClass的构造方法前,java会先寻找他的父类并执行其父类的构造器(java类加载机制)
然后在父类BaseClass中执行构造方法,同时执行this.print();
重点!此时其实仍是在ChildClass这个对象中执行父类的构造器,所以当父在父类的构造器中执行this.print()时,this指向的其实是ChildClass这个对象(如输出结果中对应的类名)
this.print()打印的num变量应该是ChildClass中的num,然而此时ChildClass还没有实例化,所以此时num还没有被赋值999,所以打印的是int型的默认值 num = 0。
当执行完父类的构造器方法时,才执行ChildClass的构造器方法,此时ClildClass中的num才被赋值,则时候输出的是 num = 999;
public class BaseClass { private int num = 1; public BaseClass() {this.print();} public void print() { System.out.println(this.getClass().toString() + " , base 's num = " + num); } }
public class ChildClass extends BaseClass { private int num = 999; public ChildClass() {this.print();} @Override public void print() { System.out.println(this.getClass().toString() + " , child 's num = " + num); } public static void main(String[] args) { BaseClass child = new ChildClass(); } }
输出结果:
class classLoad.ChildClass , child 's num = 0
class classLoad.ChildClass , child 's num = 999
原因是:
在创建一个ChildClass对象实例时,在执行ChildClass的构造方法前,java会先寻找他的父类并执行其父类的构造器(java类加载机制)
然后在父类BaseClass中执行构造方法,同时执行this.print();
重点!此时其实仍是在ChildClass这个对象中执行父类的构造器,所以当父在父类的构造器中执行this.print()时,this指向的其实是ChildClass这个对象(如输出结果中对应的类名)
this.print()打印的num变量应该是ChildClass中的num,然而此时ChildClass还没有实例化,所以此时num还没有被赋值999,所以打印的是int型的默认值 num = 0。
当执行完父类的构造器方法时,才执行ChildClass的构造器方法,此时ClildClass中的num才被赋值,则时候输出的是 num = 999;
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序