有这样的一个小程序,我觉得结果完全和预料的不一样,为什么呢?
程序如下:
class A5{
int x=6;int y=5;
public void printme(){
System.out.println("class name: " +getClass().getName());}}
public class Test10 extends A5{
int x=9;
public void printme(){
int z=super.x+6;
super.printme();
System.out.println("I am an "+getClass().getName());
}
public static void main(String arg[]){
A5 p1=new A5();
Test10 p2=new Test10();
p1.printme();
p2.printme();
}}运行结果为:
class name: A5
class name: Test10
I am an Test10
为什么不是:
class name: A5
class name: A5
I am an Test10
程序如下:
class A5{
int x=6;int y=5;
public void printme(){
System.out.println("class name: " +getClass().getName());}}
public class Test10 extends A5{
int x=9;
public void printme(){
int z=super.x+6;
super.printme();
System.out.println("I am an "+getClass().getName());
}
public static void main(String arg[]){
A5 p1=new A5();
Test10 p2=new Test10();
p1.printme();
p2.printme();
}}运行结果为:
class name: A5
class name: Test10
I am an Test10
为什么不是:
class name: A5
class name: A5
I am an Test10
解决方案 »
- 麻烦解释一下这个java程序的执行流程及结果.
- HashSet集合问题
- 线程??????
- 数组错误
- Channel问题与SwingUtilites.invokeLater()问题?????????
- 用Java NIO 异步套接字的 Select方法时,如果需要Select的对象数目太多,是否会影响Select的速度?
- 我用jbuilder 编译一个java文件的时候怎么总是说找不到main()函数?如何解决?
- 如何把bmp文件转换成jpg文件格式.
- 要从一个类里访问另一个类里的组件或变量应怎么办?
- 求助使用匿名内部类实现事件处理
- 一个简单的问题(急,在线等)
- 请教:关闭数据连接时,只关闭conection对象可以吗?
你在Test10里调用的printme(),
而printme()又调用了getClass(),
根据多态,这时候是调用的是Test10.getClass().
而用super调用父类的方法就是class name: A10
那就是说super不等同于父类对象,是么?
如果父类是抽象类,就根本没有对象可言,
所以super不是指父类对象,
java虚拟机在运行super.printme(); 时,自动将class A5中的method printme()挂到object p2上来,java虚拟机能够区分this.printme()和super.printme(),所以运行的结果是 Test10在子类Test10中,并没有也不会实例化父类对象
super不是指父类对象,
而是指 当前这个子类对象中,属于父类的那一部分方法和属性一个子类对象的组成大致是这样的 obj of subclass ---| 根类(object类)区域 |
|---------------------------|
| 子类 |
|---------------------------|
.
.
. ---> 非直接父类均已不能用super.××引用了
.
|---------------------------|
| 直接父类 | ---> 可以用super.××引用
|---------------------------|
| 当前类 | ---> 可以用this.××引用
|---------------------------|