子类B的方法覆盖父类A的方法,结果是:BBB
Bvar=2222
Avar=1111
吗?
Bvar=2222
Avar=1111
吗?
解决方案 »
- linux系统下运行jar包时报错找不到jar包中的文件
- 这个小java程序哪里出错了???
- 一个简单问题---关于Point类的setLocation方法
- 用java如何将文件复制到指定目录?
- 一个流转换的问题,请大家关注一下。
- 超级菜问题,除法!
- 高手请进,关于JColorChooser的使用问题,本人表示感谢!!!
- 在JB5中,怎样同时禁止Frame上的最小化和最大化按钮,高手请指教!!
- 我在红帽Linux下用rpm -i j2sdk-1_3_0-linux.rpm安装了jdk1.3,java装载到了/usr/java下,接下来我该how to do?
- 急急急!高手请帮忙!weblogic下的jndi怎么不起作用?
- 请问大家我想学java,有什么好的书吗?(有c基础)
- 有个笨问题,小弟想学java不知各位用什么编译器?VJ?
(1)in the function main, new B() first call A(),so we can see "AAA".
(2)because the method of dosomething is replaced by this same function in the B class(because we get the pointer of B),so we can get Bvar=0;other results can understand clearly. I donot say more.If you have some problem,you can talk with me directly.
首先实例化B()
B是从A继承过来的,那么和合成不同
就会先调用A的method&constructor
要调用class A中的各种方法和实例化构建器
首先要实例化constructor A()
而在A()中,会调用方法dosomthing但是由于
子类B中的方法dosomething 会覆盖A中的同名方法
所以调用B.doSomething()
要注意的事,在此时,因为还没有
执行public int Bvar = 2222;
所以,Bvar还是一个null
完成A()之后,再继续调用B里头的方法和实例化构建器
这个时候,是先将数据成员初始化
所以Bvar有了值2222而程序自始至终没有调用A.doSomething
所以Avar始终是null这个是我的看法,如果错了,请指正
如果对了,请给点分,谢谢
new B() 的执行过程如下
之前处始化 Bavr=0;
1 隐含调用super() 即A();
2 处始化 Bavr=2222;
3 执行B() 中的其他语句;
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
只是在java中,编译器力求让所有的值
正确的初始化,所以自动给int加上一个0
我觉得有必要说清楚...
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
原因是:
由于B是从A继承来的所以会首先初始化A,使得Avar=0,调用A的构造函数,所以输出AAA,在调用doSomething时,由于多态调用B的doSomething,所以输出Bvar=0,再初始化B的成员变量,然后调用B的构造函数,所以输出BBB和Bvar=2222,Avar=0
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
另有一问题,还是以上代码,若将两个类中的doSomething()方法都声明为static,则结果又不同,又该如何解释?
另有一问题,还是以上代码,若将两个类中的doSomething()方法都声明为static,则结果又不同,又该如何解释? 对于static方法,多态/override不起作用:这时是hide
AAA
A.doSomething()
BBB
Bvar=2222
Avar=1111