黑马程序员技术交流社区

标题: java,多态问题? [打印本页]

作者: 张庚    时间: 2013-2-4 21:07
标题: java,多态问题?
本帖最后由 张向辉 于 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().别告诉我是,方法覆盖。
作者: 王广智    时间: 2013-2-4 22:07
这个只能解释为方法的重写啊?

要不你还想解释什么?

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

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

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

当在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类中的方法执行的

浅见  望指正




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2