A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾存双 中级黑马   /  2012-7-10 03:45  /  1837 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贾存双 于 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类中的方法呢
}
};

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 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接收自己的子类对象。
回复 使用道具 举报
public static void fun(A a){
  a.fun1() ;  // 调用覆写父类中的fun1()方法
     //a.fun3();    通过(a instanceof B)可以证明a是B的实例,那么为什么不能调用B类中的方法呢
}
};

为什么子类对象向上转型后就不能调用子类里面的方法了,这样只能调用父类中被子类覆写的方法有什么意义呢?    向上转型之后只能调用父类中有的方法,因为虽然你用了子类进行了初始化,向上转型了之后就是父类类型了,而要调用子类的方法,必须向下转型才行。这样做是当你不知道要传入的对象是什么类型的时候,可以用父类的类型来接收,比如说:Person类,Stduent,Worker都是继承了Person类,当你不知道传入是Student还是Worker的时候,都可以用Person接收,这就避免了接收对象出错的问题。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
上述程序中意思就是:A a=new  B(); 这就是父类的引用指向了子类的对象。
首先要搞清楚A a=new B();
表示定义了一个A类型的引用,指向新建的B类型的对象。
由于B是继承自它的父类A,所以A类型的引用是可以指向B类型的对象。
因为是父类的引用,所以只能找到父类中的方法,或者子类中重写(覆盖)了的父类的方法。
如果具体执行自己的方法 ,就要做向下强制转型。
回复 使用道具 举报
Akm 黑马帝 2012-7-10 12:54:59
报纸

回帖奖励 +1

看看能不能中奖 {:soso_e102:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马