JAVA的多态中一道题目的问题答案有点疑惑

这样写代码是错的,父类直接依赖子类真的大丈夫么?又是一本神书,写代码的时候不会遇到这种问题。------------------------------------------------------------------------同名不同参数的方法是不同的方法,调用是在编译时确定的,这叫重载,也就是说你声明是A它就是A,声明是B它就是B,并不关心它确实是什么,而且也不知道它确实是什么同名相同参数的方法是相同的方法,调用是在运行时确定的,这叫重写。------------------------------------------------------------------------一般来说正常人写代码是这样的class A{ static a(A a){ a.b() } b(){"i\u0026#39;m a"}}class B extends A{ b(){"i\u0026#39;m b"}}
■网友
最近在自学Java,我来不自量力的答一下,可能是错的,求指教谢谢!《Head First Java》第八章里讲到:编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object的类型。因为a2的引用类型是A,所以编译器确定可用的方法:public String show(D obj){ return ("A and D"); } public String show(A obj){ return ("A and A"); } 又因为你传入的是 b,所以只能选择:public String show(A obj){ return ("A and A"); } 这段方法又被子类覆盖了,所以输出 B and A。而且public String show(B obj){ return ("B and B"); } 是重载,不可能会用到这个方法。
■网友
我觉得这个问题还是很简单的,是上转型和下转型的问题。A a2 = new B();//父类构造子类,也就是说子类实例化,然后上转型为父类。那么a2(上转型对象)可以调用父类的所有方法和属性和子类重写的方法,不可以调用子类特有的属性和方法。也就是说a2能调用的方法只有show(D obj)(父类方法)、show(A obj)(重写的方法),所以a2也就只能输出 B and A 。至于下面也输出B and A也是一样的原理。
■网友
【JAVA的多态中一道题目的问题答案有点疑惑】 楼主你这个题目应该是这样的。。
class A {
\t\tpublic String show(D obj){
\t\t\treturn ("A and D");
}
public String show(A obj){
\t\t\treturn ("A and A");
}
}
class B extends A {
\t\tpublic String show(B obj){
\t\t\treturn ("B and B");
}
public String show(A obj){
\t\t\treturn ("B and A");
}
}
class C extends B{}
class D extends B{}

public class test {
public static void main(String args){
\t\tA a1 = new A();
\t\tA a2 = new B();
\t\tB b = new B();
\t\tC c = new C();
\t\tD d = new D();
\t\tSystem.out.println(a1.show(b));
\t\tSystem.out.println(a1.show(c));
\t\tSystem.out.println(a1.show(d));
\t\tSystem.out.println(a2.show(b));
\t\tSystem.out.println(a2.show(c));
\t\tSystem.out.println(a2.show(d));
\t\tSystem.out.println(b.show(b));
\t\tSystem.out.println(b.show(c));
\t\tSystem.out.println(b.show(d));
}
}

■网友
System.out.println(a2.show(b));具体步骤大致是:1. a2的静态类型是A,b的静态类型是B,类A中符合且最接近的成员方法是show(A obj),编译可以通过。2. a2的动态类型是B,B中有show(A obj)的重载(method signature完全一样,signature的参数部分不考虑子类),因此在java的complie time决定调用的是这个B中的show(A obj)。


推荐阅读