问题描述
- 请问这段代码为什么输出null,求大神解答程序执行的顺序?
-
public class xieCheng {
private String baseName="Base";
public xieCheng(){
this.callName();
}
public void callName(){
System.out.println(baseName);
}
}public class Sub extends xieCheng {
private String baseName="Sub";
public void callName(){
System.out.println(baseName);
}public static void main(String[] args){
xieCheng xc=new Sub();
xc.callName();
}
}
解决方案
/**
* xieCheng 是父类,Sub是子类,
* xieCheng xc = new Sub(); 这样的申明方式 是 编译期是父类,如果没有callName 方法则会报编译错误,但是 实际运行时候是 运行子类的方法
* 当new Sub() 时候 ,查询这个类 是否有父类,如果有父类先初始化父类(属性-->构造器等) 当运行到父类的 callName时候,因为子类对其进行了重载,
* 则运行时候 运行子类的callName 方法,所以第一个null 是在初始化父类的时候 输出的,输出子类baseName 还未初始化的值
* 第二个 则输出的也是子类的属性
*
* 父类(baseName)初始化-->父类构造器-->子类重载父类callName-->子类callName 输出 子类baseName属性-->初始化 子类-->xc.callName();执行子类callName方法
*
*/
解决方案三:
你可以先学习一下断点调试,这样以后遇到类似问题会方便的多
解决方案四:
首先确定初始化顺序,父类->子类;
其次动态分派:根据实际类型确定调用函数,
解决方案五:
实例化一个类对象的时候,运行顺序为:
静态块
父类构造器
本类中的块
本类的构造器
类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)调用父类构造函数;
(3)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
(4)调用本身构造函数。
解决方案六:
打断点一步一步调试,这样学得很快的