黑马程序员技术交流社区

标题: 基础问题 [打印本页]

作者: 曹倩    时间: 2012-10-11 19:42
标题: 基础问题
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());
        }
}
  为什么会编译失败?
作者: 张忠豹    时间: 2012-10-11 19:54
当然会编译失败,原因:
Demo15 中写个get(),与Super中的get()方法除了返回值类型不一样之外,函数声明部分都是相同的,这根本不是重写,更不是重载,所以出错!
你要是想在Demo15 中重载get()方法的话,至少参数的类型,或者个数什么的要改变一下。
作者: 曾浩    时间: 2012-10-11 19:54
因为Demo15 继承了 Super类 所以他也得到了父类的方法
但是 public long get(){return 5;} 既没有重载也没有重写只是返回的常量不同  一个类中不能同时存在两个一样的方法虽然他们的返回值类型不同 但是在运行时虚拟机就不知道该调用那个方法了        


作者: 杨志男    时间: 2012-10-11 20:11
  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()方法,那你应该把子父类中的方法返回类型整一致了啊,要么改上面,要么改下面

作者: 曹倩    时间: 2012-10-11 20:26
{:soso_e113:}  原来是因为这个 ,感谢各位~
作者: 曹倩    时间: 2012-10-12 09:10
本帖最后由 曹倩 于 2012-10-12 09:12 编辑

             。。。。。
作者: 黄佳    时间: 2012-10-12 09:48
本帖最后由 黄佳 于 2012-10-12 09:49 编辑


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


重写方法:方法名必须一致,
而且必须保证保证参数类型,参数个数和返回类型一样
当然返回类型是对象类型时,重写方法返回类型可以是对象的子类类型
重写的方法访问权限不能更小,不能抛出更大的已检测异常,可以不抛
(要注意:父类没有抛已检测异常,子类就不能抛或者只能抛运行时异常)
作者: 徐梦侠    时间: 2012-10-12 11:30
重载的特点是函数与返回值类型无关,只要同名,则参数列表不同即可。
而重写父类函数的特点是方法名,返回类型,参数列表都必须相同。
不管哪种,类中的同名函数返回值类型都必须相同,所以这里会报错。
作者: 李贺晓    时间: 2012-10-12 11:46
重载和重写你没搞明白
重载跟重写是java多态型的两种不同表现
重载是静态多态性,即同名不同参   
重写就是覆盖,动态多态性,同名又同参   
你的既不是重载也不是覆盖,你的 Demo15继承了上面的那个类,也就包含有get方法, 和你又写的那get方法起冲突了,你要是调用get方法,jvm不知道该调用哪个get方法,所以编译失败。




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