public class Parent {}
public class Sub extends Parent {}
public class A {
public void fun(Parent p){
System.out.println("A");
}
}public class B extends A {
public void fun(Sub s){
System.out.println("B");
}
}public class Test {
public static void main(String[] args) {
Sub s = new Sub();
Parent p = s;
B b = new B();
A a = b;
a.fun(p);
a.fun(s);
b.fun(p);
b.fun(s);
}
}
public class Sub extends Parent {}
public class A {
public void fun(Parent p){
System.out.println("A");
}
}public class B extends A {
public void fun(Sub s){
System.out.println("B");
}
}public class Test {
public static void main(String[] args) {
Sub s = new Sub();
Parent p = s;
B b = new B();
A a = b;
a.fun(p);
a.fun(s);
b.fun(p);
b.fun(s);
}
}
A
A
B
正确答案
b.fun(p);
当然是调用从A继承下来的fun(Parent p)函数
在class B中存在从class A继承下来的
public void fun(Parent p){
System.out.println("A");
}
方法,而且Parent不能被转换成Sub,所以不可能调用
public void fun(Sub s){
System.out.println("B");
}
对象a引用子类对象,调用fun()方法时,由于子类没有重写父类的fun()方法,所以不构成多态,实际上调用的都是父类的fun()方法。
class B中通过继承造成了fun()方法的重载,上面已有大仙给出分析了.重写是是子类与父类之间的多态性,对父类的函数进行重新定义,与其父类有相同的函数名称和参数。
因为 s 是集成了 parent
所以 s是可以转成parent的
因为A里没有 参数为S的方法 但是有P的方法
所以s强制转换p故 打印A~~
我的理解对不
public class Parent {}
public class Sub extends Parent {}
public class A {
public void fun(Parent p){
System.out.println("A");
}
}public class B extends A {
public void fun(Sub s){
System.out.println("B");
}
} Sub s = new Sub();
Parent p = s;
B b = new B();
A a = b;
在调用fun方法的时候首先判断传入的参数是什么
a.fun(p); 传入的是Parent对象,只能执行A中的fun方法。
a.fun(s); 传入的是Parent子类对象,a对象不能调用其子类B中的fun 方法,只能执行其自己的fun方法。
b.fun(p); 传入的是Parent对象,b对象会调用父类的fun方法。
b.fun(s); 传入的是Parent子类对象,会直接执行B类的fun 方法。答案就是:
AAAB
A的子类B对A的fun方法进行了重载(参数发生改变), 所以B类对象b实际持有两个fun方法,一个接受Parent, 一个接受Sub参数, 所以b接受两次传入参数的结果不同,因为它在两次分别调用了不同的方法,而a两次调用的是同一个方法。