What will happen when you attempt to compile and run the following code?
class Base{
int i = 99;
public void amethod(){
System.out.println("Base.amethod()");
}
Base() {
amethod();
}
} class Derived extends Base{
int i = -1; public static void main(String argv[]){
Base b = new Derived();
System.out.println(b.i);
b.amethod();
} public void amethod(){
System.out.println(i);
System.out.println("Derived.amethod()");
}
}运行结果:
0
Derived.amethod()
99
-1
Derived.amethod()我的问题:
1.Base()调用Derived里重载后的amothod方法,怎么回事?
2.”构造器是静态绑定的“是什么意思?
class Base{
int i = 99;
public void amethod(){
System.out.println("Base.amethod()");
}
Base() {
amethod();
}
} class Derived extends Base{
int i = -1; public static void main(String argv[]){
Base b = new Derived();
System.out.println(b.i);
b.amethod();
} public void amethod(){
System.out.println(i);
System.out.println("Derived.amethod()");
}
}运行结果:
0
Derived.amethod()
99
-1
Derived.amethod()我的问题:
1.Base()调用Derived里重载后的amothod方法,怎么回事?
2.”构造器是静态绑定的“是什么意思?
解决方案 »
- 求html 页面MP4播放器例子 希望我们一同把他解决掉大家进来顶一下把 全分抛出 拼了
- insert '}' to complete classbody问题!
- Thread 的问题,请高手解答。
- Frame继承问题
- 求J2SE编写的梭哈小游戏!
- 即时通讯软件用java 可以做吗
- 再次提问Jframe窗体的背景图和JPanel背景图的设置方法
- 在使用JFileChooser保存文件,当浏览目录的时候,怎么样做才能保证文件名Field中的值不变?
- 有处理字符串的高手吗,进来看看
- 在import gjt.*的时候报错说找不到gjt包,我装了最新的jdk,为什么呢?
- 可能这三个问题问得有点傻,但是我真的不懂~
- 请求高手解决,JFrame可不可以做出自己想要的窗体形状?
但构造函数是不可继承的,他是前期(静态)绑定,也就是说,你Base b = new Derived();这句话,如果Derived没有显式声明一个无参构造器,那么它的父类的构造器就被调用。这里也就是调用Base()。而在Base()里,又调用amethod(),这次是Derived的了(后期绑定)。
这个题还有个陷阱是那个0,这涉及到类的初始化问题,int i = -1;这个赋值是发生在构造函数调用之后进行的,在这之前,它被置为0,所以这里会打印出一个0。具体可看think in java 2nd(侯捷译)217页,或原英文版305页。
Dirived(){
super();
}
----------------------------
会产生什么样结果?先产生一个Derived对象,然后复制给b reference(仅仅是个reference).当我们产生Derived对象时,会先初始化i,然后调用构造函数,调用构造函数的时候,因为它时继承自Base的时候,所以会调用Base的构造函数,有了Base()的运行,运行amethod()方法,关键就在这里,不管怎么说,b ref里面总归是Derived的对象,就是后期绑定,鉴于面向对象就是发送消息给对象的原则,它肯定知道调用Dervied的amethod()方法的.所以输出了:
0
Derived.amethod()
-------------------------------------------
2.”构造器是静态绑定的“是什么意思?
===================================典型的考察你的继承"上溯造型"知识
1.这里最终调用的是Derivde.amethod();
2.所谓静态绑定就是程序运行前初始化,动态就是程序运行中初始化(又称后期绑定);
这些基本的东西在Thinking in Java 里都有的,好象在第六/七章中,建议楼主阅读!