黑马程序员技术交流社区

标题: 关于对象的多态性 [打印本页]

作者: 贾存双    时间: 2012-7-10 03:45
标题: 关于对象的多态性
本帖最后由 贾存双 于 2012-7-10 16:14 编辑

class A{   
public void fun1(){  
  System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
  this.fun1() ;  
}
};
class B extends A{
public void fun1(){  
  System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
  System.out.println("B --> public void fun3(){}") ;
}
};
public class Demo{
public static void main(String asrgs[]){
  fun(new B()) ;
}
public static void fun(A a){
  a.fun1() ;  // 调用覆写父类中的fun1()方法
     //a.fun3();    通过(a instanceof B)可以证明a是B的实例,那么为什么不能调用B类中的方法呢
}
};

为什么子类对象向上转型后就不能调用子类里面的方法了,这样只能调用父类中被子类覆写的方法有什么意义呢?

作者: 游兴钟    时间: 2012-7-10 04:11
本帖最后由 achilles 于 2012-7-10 04:24 编辑

new B()没有fun5()方法  new C()没有fun3()方法他们的父类也只有fun1()  fun2()
而照你的代码看 你却是要求new B().fun1() new B().fun3() new B().fun5()    new C().fun1() new C().fun3() new C().fun5()
这怎么可能同时实现?
为什么子类对象向上转型后就不能调用子类里面的方法了,这样只能调用父类中被子类覆写的方法有什么意义呢?
这个问题的答案其实也就是多态的优点, 多态可以提高程序的扩展性。嗯,比如你可以参考IO中的BurreredReader类中多态的应用,用Reader接收自己的子类对象。
作者: 封明川    时间: 2012-7-10 09:21
public static void fun(A a){
  a.fun1() ;  // 调用覆写父类中的fun1()方法
     //a.fun3();    通过(a instanceof B)可以证明a是B的实例,那么为什么不能调用B类中的方法呢
}
};

为什么子类对象向上转型后就不能调用子类里面的方法了,这样只能调用父类中被子类覆写的方法有什么意义呢?    向上转型之后只能调用父类中有的方法,因为虽然你用了子类进行了初始化,向上转型了之后就是父类类型了,而要调用子类的方法,必须向下转型才行。这样做是当你不知道要传入的对象是什么类型的时候,可以用父类的类型来接收,比如说:Person类,Stduent,Worker都是继承了Person类,当你不知道传入是Student还是Worker的时候,都可以用Person接收,这就避免了接收对象出错的问题。
作者: 孙新强    时间: 2012-7-10 12:04
上述程序中意思就是:A a=new  B(); 这就是父类的引用指向了子类的对象。
首先要搞清楚A a=new B();
表示定义了一个A类型的引用,指向新建的B类型的对象。
由于B是继承自它的父类A,所以A类型的引用是可以指向B类型的对象。
因为是父类的引用,所以只能找到父类中的方法,或者子类中重写(覆盖)了的父类的方法。
如果具体执行自己的方法 ,就要做向下强制转型。

作者: Akm    时间: 2012-7-10 12:54
看看能不能中奖 {:soso_e102:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2