有这样的一个小程序,我觉得结果完全和预料的不一样,为什么呢?
程序如下:
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
你在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.××引用
|---------------------------|