Abstract class A{
public A(){draw();}
abstract draw();
}
class B extends A{
public B(){}
void draw(){}
}
public class Test{
public static void main(String[] args){
B b=new B();
}
}
根据java里构造函数的递归调用过程,
1,B构造器构造对象的时候先调用A的构造器,
2,而A的构造器则会调用A的draw方法,
3,而B又是实现A的子类,则A的draw方法会调用B的draw方法,这时B又要调用A的构造器,
这样一来不是死循环了?不知道我这样理解对不对,
public A(){draw();}
abstract draw();
}
class B extends A{
public B(){}
void draw(){}
}
public class Test{
public static void main(String[] args){
B b=new B();
}
}
根据java里构造函数的递归调用过程,
1,B构造器构造对象的时候先调用A的构造器,
2,而A的构造器则会调用A的draw方法,
3,而B又是实现A的子类,则A的draw方法会调用B的draw方法,这时B又要调用A的构造器,
这样一来不是死循环了?不知道我这样理解对不对,
B继承A(抽象类)
A里面出现的方法.B里都要继承下了.
然后B在开始完成剩下的构造过程就ok了。
abstract class A{
public A(){
draw();
System.out.println("A");
}
abstract void draw();
}
class B extends A{
public B(){}
void draw(){
System.out.println("B");
}
}
public class test{
public static void main(String[] args){
B b=new B();
}
}
1,B构造器构造对象的时候先调用A的构造器,
2,而A的构造器则会调用A的draw方法,
3,这里调用A的draw时,因为B实现A(我觉的也是一种覆盖方法.)的方法.那它就会去执行B的方法,不会再构造一个B,因此就不会再去调用A的构造方法了.
public class TestConstructor {
public static void main(String[] args) {
B b = new B();
}
}abstract class A {
public A () {
System.out.println("A is constructing");
draw();
}
abstract void draw();
}class B extends A {
public B () {
// super(); // 构造子类时,这条语句总是默认执行。
System.out.println("B is constructing");
} void draw(){
System.out.println("B.draw");
}
}---------- 执行结果 ----------
// 首先默认执行super()
A is constructing
B.draw// 执行自身语句
B is constructing
------------------------------理解继承机制,记着把父类和子类扁平化。
首先,所有基类的构造方法在子类的构造方法中都会第一个被调用(隐式或显式),如果基类是一个具体类,那么在调用子类实例化时也会实例化一个基类对象;如果基类是一个抽象类,因为抽象类不允许生成实例,所以就算执行了super(),也不会生成抽象基类的实例。所以对于抽象基类构造方法的作用,主要是对基类进行一些必要的初始化,这样就减轻了子类初始化的工作量(我自己是这么理解的,不知道对不对)
楼住的困惑应该是来自于抽象类中的那个抽象方法draw(),你的问题是为什么基类构造器好像“看到了”子类的具体draw()方法了,其实就像UnAgain()朋友说的,理解继承机制,记着把父类和子类扁平化。楼住不妨这样看待这个B类:
class B extends A {
public B () {
System.out.println("A is constructing");
draw();
System.out.println("B is constructing");
} void draw(){
System.out.println("B.draw");
}
}
其实这样的模式就是对继承机制的一种应用,当然可能这种模式好像没什么实际意义。你在抽象基类构造器中调用这个具体方法真有什么具体应用价值?所以不建议。
还是应该在抽象基类中声明接口(抽象方法),在子类中根据子类的要实现的功能实现它,通过子类对象去调用,这是正常的模式。
public A(){
System.out.println("contruct A");
draw();
System.out.println("exit A");
}
abstract void draw();
}
class B extends A{
public B(){
System.out.println(" contructor b");
}
void draw(){
System.out.println("Class B");
}
}
public class Test{
public static void main(String[] args){
B b=new B();
}
}
结果是:
contruct AClass Bexit A contructor b
class B extends A {
public B () {
System.out.println("A is constructing");
draw(); //这个就是自己的draw方法了?是吧?
System.out.println("B is constructing");
} void draw(){
System.out.println("B.draw");
}
}
就像这样,恩,