今天在看Java编程思想的时候遇上的问题 使用到的知识是Java的多态方法和构造器调用顺序
当我们在导出类构造器中没有显式调用基类构造器时,会默认调用基类的默认构造器,同时如果我们在导出类的方法覆盖了基类的某一个方法,且在这个方法中使用到导出类的参数时,就会出现问题。
可能这番话有点绕 看一下代码 可能会清楚一些。
package polymorphism;
class base{
//基类中的draw()
void draw(){
System.out.println("I am drawing...");
}
public base(){
System.out.println("Before drawing ....");
draw();
System.out.println("After drawing....");
}
}
public class export extends base{
private int exportt = 1;
public export(int Exportt){
exportt = Exportt;
// System.out.println("My export is "+exportt);
draw();
}
//导出类的draw()覆盖了基类中的draw()
public void draw(){
System.out.println("The export is drawing and my export is "+exportt );
}
public static void main(String argv[]){
new export(5);
}
}
这时 如果我们不清楚原因的话 可能认为 我在导出类中已经初始化了 exportt这个变量 为什么会是 0
原因有以下几点:
1.在导出类构造器中会首先调用基类的构造器
2.在基类构造器中没有对exportt进行初始化 所以使用的是int的默认值 0
3.在进行基类初始化之后 才会对导出类中的变量进行初始化 也就是
int exports = 1;
从这个问题引出了一条构造器准则 也是我想要表达的东西
在构造器中尽可能用简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。