java多态(关于参数传入)
假使,父类为 :Parent 子类为:Son则会有下面的情况:
Parent p = new Son();
那么这个只能调用父类是的方法,如果子类Son有重写这些方法,就会调用Son中重写父类的方法。 有了这个前提,问题来了:
这里有一个方法传入的参数是父类(Parent),那么也可以传入它的子类Son。因为可以这样转换
Parent p = new Son();
public void test(Parent p){……}
但是传入Son时,为什么可以调用son自己特有的方法,而是不前一种情况:只调用子类中重写父类的法。
这里我只能理解前一种情况,后一种不知道该怎么理解。
------解决方案--------------------new 的谁就调用谁
------解决方案--------------------可以将p强转为Son类型来调用Son类的方法,参考以下代码:
public class Test3 {
public static void main(String[] args) {
Parent parent = new Son();
parent.a();
test(parent);
Son son = new Son();
son.a();
test(son);
}
static void test(Parent p) {
p.a();
// error
// p.b();
if (p instanceof Son) {
((Son) p).b();
}
}
}
class Parent {
public void a() {
System.out.println("pa");
}
}
class Son extends Parent {
@Override
public void a() {
System.out.println("sa");
}
public void b() {
System.out.println("sb");
}
}
------解决方案--------------------new的是son 自然是可以调用son的
所有方法了 因为parent和son不是同一个对象,new的那个对象就能调用它的所有方法!
------解决方案--------------------不好意思,昨天我说错了!正确的说法: FatherClass f = new SonClass() 当父类引用f指向其子类的对象的时候,通过f无法访问专属于子类对象的成员。假如子类中有对父类方法的重写,那么根据多态机制,通过f访问这个方法的时候实际访问的是子类中重写的方法。 如果想调用子类的特有成员就是 必须 SonClass s = new SonClass();
------解决方案--------------------额 表示没明白楼主的意思 Parent p = new Son();
public void test(Parent p){……}
这个怎么可能可以调用子类扩展的方法呢?除非你做向下转型 不过向下转型是不安全的 违反了里氏代换原则
------解决方案--------------------这个问题的关键不是多态 应该是继承 这样再来看待他就简单了撒
------解决方案--------------------完全不懂你的“问题来了”是什么意思。“传入Son时,为什么可以调用son自己特有的方法”???
可能吗?如果向下造型,也和前面的情形一样。