问题描述
- 求解一个关于JAVA的问题
-
我的代码如下:public abstract class Example1 {
abstract void testAbstract();
Example1(){//(1)首先执行父类构造方法
System.out.println("before testAbstract()");
testAbstract();//如果调用了抽象方法,调用子类覆盖的方法。这里调用Atest类的testAbstract()方法
System.out.println("after testAbstarcat()");
}
public static void main(String args[]){
new Atest();
}
}
class Atest extends Example1{
private int i=1;//(2)使成员变量进行初始化
void testAbstract(){
System.out.println("testAbstract()"+i);
}
public Atest(){//(3)调用子类构造方法
System.out.println(i);
}
}
Eclipse执行结果如下:
before testAbstract()
testAbstract()0
after testAbstarcat()
1我刚接触java不久,请教为什么是“testAbstract()0”而不是“testAbstract()1”?
解决方案
先执行父类的构造,此时Atest类自己的i还没有初始化,所以是0
解决方案二:
java初始化过程
父类变量初始化-父类构造函数-子类变量初始化-子类构造函数。
也就是父类构造函数中调用testAbstract是访问子类的testAbstract方法,而根据顺序这时候子类的变量i还进行赋值,还是默认值0.
解决方案三:
初始化时,先调用父类构造函数
解决方案四:
有父才有子,有个先后顺序记住就行了
解决方案五:
子类的成员在被调用的时候会自动调用父类的构造函数并初始化父类的相应成员
解决方案六:
先执行父类再执行子类
解决方案七:
这个顺序就是先执行父类,然后是子类,也是为了达到代码的重复利用吧