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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭孟涛 高级黑马   /  2013-2-19 01:45  /  1267 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭孟涛 于 2013-2-19 02:38 编辑

Object是所有类的基类,Object不能作为父类吗?

代码如下:
  1. class ObjectDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Object ob = new Test();  
  6.                 System.out.println(ob.talk()); // 这里打印为什么出错
  7.         }
  8. }

  9. class Test
  10. {
  11.         public int talk(){
  12.                 return 6;
  13.         }
  14. }


  15. class Test1  extends Test
  16. {
  17.       
  18. }
复制代码
这样也是错误的:
  1. class ObjectDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Object  ob = new Test(); // 声明了一个Object 父类的ob变量,并实例化其子类Test
  6.                 System.out.println(ob.talk()); // 这里打印正确
  7.         }
  8. }

  9. class Test extends Object  // 这里又继承了一下,默认就继承了。这样写只是看上出思路更直观点
  10. {
  11.         public int talk(){
  12.                 return 6;
  13.         }
  14. }


  15. class Test1  extends Test
  16. {
  17.       
  18. }
复制代码
如下这个就是打印就正确:
  1. class ObjectDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Test ob = new Test1(); //
  6.                 System.out.println(ob.talk()); // 这里打印正确
  7.         }
  8. }

  9. class Test
  10. {
  11.         public int talk(){
  12.                 return 6;
  13.         }
  14. }


  15. class Test1  extends Test
  16. {
  17.       
  18. }
复制代码
父类 实例 = new 子类()
实例可以调用父类中特有的方法(未在子类中覆盖的方法)
实例可以调用子类中覆盖父类的方法
但不可以调用子类中特有的方法(即父类中没有的方法

3 个回复

倒序浏览
Object就是java类里面的上帝(剽窃下毕老师的话)
不是Object类出问题了,是你的代码出问题了。
就拿你第一块代码来说
  1. class ObjectDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Object ob = new Test(); //这里建立了一个Object引用指向了一个Test对象
  6.                                                                                 //这里就是传说中的父类引用指向子类对象,也就是说实现了多态
  7.                 System.out.println(ob.talk()); //这里你就出错了,Object里面可没有talk()这个方法吧?
  8.         }
  9. }

  10. class Test
  11. {
  12.         public int talk(){
  13.                 return 6;
  14.         }
  15. }


  16. class Test1  extends Test
  17. {
  18.       
  19. }
复制代码
对于多态,可以总结它为:      
一、使用父类类型的引用指向子类的对象;      
二、该引用只能调用父类中定义的方法和变量;      
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

就像上面的代码中,如果Object类里面有一个talk()方法,那么子类Test中就形成方法覆盖,那么此时就可以这么写:obj.talk(),此刻形成了多态,也就不会有错。
但是,Oject中并没有talk方法,你去使用obj.talk(),这当然会报错。

你再看看你能编译通过那块代码,不论父类Test中,和子类Test1中都有talk()方法。

评分

参与人数 1黑马币 +12 收起 理由
郭孟涛 + 12 赞一个!十分感谢

查看全部评分

回复 使用道具 举报
在多态中,引用型变量不能调用自己所属类中没有的方法,ob属于Object类,而talk()不是Object类中的方法,因此第一份代码出现编译错误,打印失败。Test默认就是继承Object类的,所以第二份代码和第一份代码并无区别,因此一样打印错误。Object能做父类,但此处不是Object能不能做父类的问题,而是要用多态中成员函数的特点去分析错误原因。
回复 使用道具 举报
上面更正一下,就是最后一句话错了。
应该说“在你能编译通过那块代码中,因为父类Test中有talk方法,所以
Test ob = new Test1();  
system.out.println(ob.talk());
这样写没问题,因为ob.talk()调用的是父类中的方法

如果在子类也就是Test1中,重写talk方法的话
Test ob = new Test1();  
system.out.println(ob.talk());//那么这里调用的就是Test1中的talk方法了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马