日期:2014-05-20  浏览次数:20760 次

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自己特有的方法”???
可能吗?如果向下造型,也和前面的情形一样。