A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-4 21:07  /  1253 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-6 15:11 编辑

package a;

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().别告诉我是,方法覆盖。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

2 个回复

正序浏览
我是这么认为的,
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类中的方法执行的

浅见  望指正

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
这个只能解释为方法的重写啊?

要不你还想解释什么?

比如说你覆盖了Objec类的toString()方法,如果还想调用Object类原有的toString方法,只能在子类中用super.toString();

你可以在B类的fa()方法上面加上,@Override注解来验证一下,如果不是覆盖,编译的时候会报错。

这个我测试过了,加上@Override没有报错,所以符合覆盖的语法规则。

当在A类调用fa方法时,是先找子类有没有覆盖此方法,找到了之后用子类的,如果没有找到才会用A类的。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马