public class Polymorphism {
public static void main(String[] args) {
A b = new B();
b.fb();
}
}
class A {
public A() {
}
public void fa() {
System.out.println("CLASS A :Function fa Runing......");
}
public void fb() {
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
}
}
class B extends A {
public B() {
}
public void fa() {
System.out.println("CLASS B :Function fa Runing......");
}
public void fb() {
System.out.println("CLASS B :Function fb Runing......");
super.fb();
System.out.println("CLASS B :Function fb Stop......");
}
}
结果为什么是:
CLASS B :Function fb Runing......
CLASS A :Function fb Runing......
CLASS B :Function fa Runing......
CLASS A :Function fb Stop......
CLASS B :Function fb Stop......
也就说:super.fb();为什么执行B中的fa(),而不是A中的fa().别告诉我是,方法覆盖。作者: 王广智 时间: 2013-2-4 22:07
这个只能解释为方法的重写啊?
当在A类调用fa方法时,是先找子类有没有覆盖此方法,找到了之后用子类的,如果没有找到才会用A类的。作者: 刘凯 时间: 2013-2-5 01:58
我是这么认为的,
1.super.fb();只是在调用父类的方法,父类对象没有关系
2.开辟空间 A b = new B(); 方法区里应该是子类对象的方法,只是用父类的类型的b指向了该子类对象
3.super.fb();完全可以被代替,
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
而fa();默认的是this.fa(); 而这个this代表的是当前对象 也就是说是B类的一个对象 所以调用的必然是B类中的fa();方法
记忆方式: 可以用
System.out.println("CLASS A :Function fb Runing......");
fa();
System.out.println("CLASS A :Function fb Stop......");
把发fa();代替。
然而比如说 class A中有个int x=1; classB中有个int x=2;
如代码
class A {
public A() {
}
int x = 1;
public void fa() {
System.out.println("CLASS A :Function fa Runing......"+x);
}
public void fb() {
System.out.println("CLASS A :Function fb Runing......"+x);
fa();
System.out.println("CLASS A :Function fb Stop......"+x);
}
}
class B extends A {
public B() {
}
int x = 2;
public void fa() {
System.out.println("CLASS B :Function fa Runing......"+x);
}
public void fb() {
System.out.println("CLASS B :Function fb Runing......"+x);
super.fb();
System.out.println("CLASS B :Function fb Stop......"+x);
则打印结果为
CLASS B :Function fb Runing......2
CLASS A :Function fb Runing......1
CLASS B :Function fa Runing......2
CLASS A :Function fb Stop......1
CLASS B :Function fb Stop......2
也就是说
调用super.fb()后
其中
System.out.println("CLASS A :Function fb Runing......");
System.out.println("CLASS A :Function fb Stop......");
这两句是按A类中的方法执行的
而fa();方法就又调回B类中的对象 是按B类中的方法执行的