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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹倩 中级黑马   /  2012-10-11 19:42  /  1782 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Super
{
        public int get(){return 4;}
}
class Demo15 extends Super
{
        public long get(){return 5;}       

        public static void main(String[] args)
        {
                Super s=new Demo15();
                System.out.println(s.get());
        }
}
  为什么会编译失败?

点评

把毕老师的java基础一定要好好看看  发表于 2012-10-11 20:28

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
当然会编译失败,原因:
Demo15 中写个get(),与Super中的get()方法除了返回值类型不一样之外,函数声明部分都是相同的,这根本不是重写,更不是重载,所以出错!
你要是想在Demo15 中重载get()方法的话,至少参数的类型,或者个数什么的要改变一下。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
因为Demo15 继承了 Super类 所以他也得到了父类的方法
但是 public long get(){return 5;} 既没有重载也没有重写只是返回的常量不同  一个类中不能同时存在两个一样的方法虽然他们的返回值类型不同 但是在运行时虚拟机就不知道该调用那个方法了        

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. class Super
  2. {
  3.          public int get(){return 4;}
  4. }
  5. class Demo15 extends Super
  6. {
  7.          public long get(){return 5;} //既不是重载也不是重写,现在这个get()方法是Demo15自己独有的方法      

  8.         public static void main(String[] args)
  9.          {
  10.                  Super s=new Demo15();
  11.                  System.out.println(s.get());//那这里,你是想让虚拟机调用谁的get()方法那
  12.          }
  13. }
复制代码
既然你继承了Super类,那你应该是想在Demo15子类中重写get()方法,那你应该把子父类中的方法返回类型整一致了啊,要么改上面,要么改下面

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
{:soso_e113:}  原来是因为这个 ,感谢各位~
回复 使用道具 举报
本帖最后由 曹倩 于 2012-10-12 09:12 编辑

             。。。。。
回复 使用道具 举报
黄佳 中级黑马 2012-10-12 09:48:51
7#
本帖最后由 黄佳 于 2012-10-12 09:49 编辑


子类调用父类的方法,   执行的是子类重写父类的方法,    你的Demo15里的  get() 方法与父类的 get() 方法没有重写关系


重写方法:方法名必须一致,
而且必须保证保证参数类型,参数个数和返回类型一样
当然返回类型是对象类型时,重写方法返回类型可以是对象的子类类型
重写的方法访问权限不能更小,不能抛出更大的已检测异常,可以不抛
(要注意:父类没有抛已检测异常,子类就不能抛或者只能抛运行时异常)

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
重载的特点是函数与返回值类型无关,只要同名,则参数列表不同即可。
而重写父类函数的特点是方法名,返回类型,参数列表都必须相同。
不管哪种,类中的同名函数返回值类型都必须相同,所以这里会报错。
回复 使用道具 举报
重载和重写你没搞明白
重载跟重写是java多态型的两种不同表现
重载是静态多态性,即同名不同参   
重写就是覆盖,动态多态性,同名又同参   
你的既不是重载也不是覆盖,你的 Demo15继承了上面的那个类,也就包含有get方法, 和你又写的那get方法起冲突了,你要是调用get方法,jvm不知道该调用哪个get方法,所以编译失败。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马