其实就是第一个输出有点不懂,不过经过单步调试后发现,在B b=new B();中编译器先寻找
class B的构造函数,没找到,由于B 是继承与A,所以编译器便以A 的构造函数作为默认的构造函数了,所以调用print(),即B自己的print(),输出bbb
A a=new A();是很明显的,调用A的print(),输出aaa
a.print();a是A的一个实例,也调用A的print(),输出aaa
a=b;
a.print();前一句使a指向b,因为A是B的超类,所以可以这么赋值,即a指向b,所以a.print()访问b的print(),输出bbb
最后一个类似
class B的构造函数,没找到,由于B 是继承与A,所以编译器便以A 的构造函数作为默认的构造函数了,所以调用print(),即B自己的print(),输出bbb
A a=new A();是很明显的,调用A的print(),输出aaa
a.print();a是A的一个实例,也调用A的print(),输出aaa
a=b;
a.print();前一句使a指向b,因为A是B的超类,所以可以这么赋值,即a指向b,所以a.print()访问b的print(),输出bbb
最后一个类似
Thinking in JAVA的第六章末尾有比较详细的解答,值得一看
第一个 b=new B() 调用本身的print 当然是bbb
第二个 a=new A() 调用A的构造函数 当然是aaa
第三个 a.print 调用A的print函数 当然是aaa
第四个 a=b 了,所以a.print 和 b.print 打印出来的当然是 bbb bbb
所以
bbb
aaa
aaa
bbb
bbb ,拜托,看问题仔细点?OK
class B的构造函数,没找到,由于B 是继承与A,所以编译器便以A
的构造函数作为默认的构造函数了,所以调用print(),
即B自己的print(),输出bbb]这个我认为不太准确:
- A的构造器被调用的原因不是因为B没有写构造器,无论B写没写构造器,A的
某个构造器都要调用,因为A是B的父类
- B中如果没有显式地写构造函数的话,则编译器为其自动添加“null 构造器”,
即无参数构造器
- 第一个bbb的原因是因为override[照bsd的说法,岂不是每个子类构造时要把父类,父类的超类的构造函数
全部执行一遍??? ]是的,TIJ里有介绍
看看这个程序好了class C
{
public C()
{
print();
}
public void print()
{
System.out.println("ccc");
}
}class A extends C
{
public A()
{
print();
}
public void print()
{
System.out.println("aaa");
}
}class B extends A
{
public void print()
{
System.out.println("bbb");
}
}public class mytest
{
public mytest()
{
}
public static void main(String[] args)
{
A a=new A();
}
}照上面的观点,打印出来的岂不是ccc aaa,但结果就是aaa
aaa
aaa第一个aaa是C构造器+override造成的,第二个aaa是A构造器造成的,
所以确实是所有父类的构造器都要调用的(包括java.lang.Object)
另外,Java中在interface中定义的方法,全都是public abstract的
http://www.csdn.net/expert/topic/390/390404.shtm