当前位置: 代码迷 >> J2SE >> 关于多态。解决方案
  详细解决方案

关于多态。解决方案

热度:33   发布时间:2016-04-23 19:57:40.0
关于多态。。
public class A {
 public String show(D obj){
         return ("A and D");
  } 
  public String show(A obj){
         return ("A and A");
  } 
}
class B extends A{
    public String show(B obj){
           return ("B and B");
    }
    public String show(A obj){
           return ("B and A");
    } 
}
public class C extends B{
}
public class D extends B{
}
public class test {

public static void main(String[] args) {
// TODO Auto-generated method stub
 A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C(); 
        D d = new D(); 
        System.out.println(a2.show(b));   
        System.out.println(a2.show(c));   
        System.out.println(a2.show(d));   
}

}
输出结果应该是什么?why?~
------解决思路----------------------
运行的结果是:B and A
                            B and A
                            A and D
解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
------解决思路----------------------
B and A
B and A
A and D
正确
------解决思路----------------------
继承结构:B继承A,C和D继承B
执行结果是:
B and A
B and A
A and D
说明:
B and A  这个不用说了,直接调用B.show(A);
B and A  这个我也没理解,debug运行走的是B.show(A);但是为什么不走B.show(B obj)呢,着实没搞懂;
A and D 这个很好理解,走的是B.show(D obj)方法,此方法是从A中继承过来的
------解决思路----------------------



引用:
Quote: 引用:

运行的结果是:B and A
                            B and A
                            A and D
解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)

谢谢~但有句话不懂,"show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。"为什么show(A obj)在子类B里面被覆盖重写,就调用show(A obj)方法了呢?
多态的三要素:1,要有继承 2要有方法重写 3父类引用指向之类的对象。调用父类引用中被子类重写的方法show(),实际执行的是调用之类的show(),这就是多态的定义,不要问为什么,会用就行。父类A有个方法fun(),它的子类B1,B2,B3分别重写方法fun()。A a1=new B1();A a2=new B1();A a3=new B1();a1.fun(),a2.fun(),a3.fun()表现出不同的行为,这里a1,a2,a3都是父类引用对象,执行一个父类引用对象的方法fun(),却表现出不同的行为(分别是子类B1,B2,B3里面的fun()),这就体现出了多态。
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

运行的结果是:B and A
                            B and A
                            A and D
解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)

谢谢~但有句话不懂,"show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。"为什么show(A obj)在子类B里面被覆盖重写,就调用show(A obj)方法了呢?
多态的三要素:1,要有继承 2要有方法重写 3父类引用指向之类的对象。调用父类引用中被子类重写的方法show(),实际执行的是调用之类的show(),这就是多态的定义,不要问为什么,会用就行。父类A有个方法fun(),它的子类B1,B2,B3分别重写方法fun()。A a1=new B1();A a2=new B1();A a3=new B1();a1.fun(),a2.fun(),a3.fun()表现出不同的行为,这里a1,a2,a3都是父类引用对象,执行一个父类引用对象的方法fun(),却表现出不同的行为(分别是子类B1,B2,B3里面的fun()),这就体现出了多态。
不好意思写错了,应该是A a1=new B1();A a2=new B2();A a3=new B3();
------解决思路----------------------
我看懂了一点。
因为a2的类型是A,所以a2永远只能调A中的方法及其子类的重写方法,子类的其他方法都是调不到的。就像接口一样,只能调接口方法,实现写再多其他别的方法都是不可见的。
------解决思路----------------------
引用:
运行的结果是:B and A
                            B and A
                            A and D
解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
你该不会是搞c++的吧?
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

运行的结果是:B and A
                            B and A
                            A and D
解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
你该不会是搞c++的吧?

java
不是说你 我说的是一楼
------解决思路----------------------
实际上这里涉及方法调用的优先问题?,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工作的。?
??比如,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B?obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A?obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A?obj)方法,因此最终锁定到类B的show(A?obj),输出为"B?and?A”。
同理,a2.show(c),c是类C的一个实例,C继承与B,于是到B中找有没有show(C obj)方法,没有找到,又去A中找,A中也没有。所以转到第三优先级this.show((super)O),O为C,(super)O为(super)C即B;即相当于是a2.show(b),又转到上面的过程,即输出结果也是“B and A”;
同理:因为A中存在show(D obj)这个方法,所以输出结果是“A and D"
------解决思路----------------------
编译报错,a2.show(c)编译时报错,A类中没有show(C obj)的方法,a2在编译时是A类,A类中没有show(C obj)的方法,编译时报错
  相关解决方案