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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马--张帅 初级黑马   /  2012-8-31 21:58  /  2527 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Fu
{
        public Fu getArea(Fu f){}    //(1)
        public void show(int a,int b){} //(2)
}
class Zi extends Fu
{
        public Fu getArea(Zi z){} //(3)
        public void show(int a,long b){} //(4)
}

问题是:(1)和(3)是否能形成覆盖?能形成覆盖的话,为什么?
        (2)和(4)是否能形成覆盖?能形成覆盖的话,为什么?
         

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 新人鼓励!

查看全部评分

9 个回复

倒序浏览
不能,这样写可以看成是重载,重载是看同名函数的参数列表,而覆盖则是要遵循“两同两小一大”规则,“两同”指方法名相同,形参列表相同;“两小”指子类方法的返回值类型比
父类方法的返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是
子类方法的访问权限应该比父类方法的访问权限更大或相等。
注意: 静态只能覆盖静态,如果父类方法具有 private 访问权限,则该方法对其子类是隐藏的,如果子类中定义了一个与父类private方法具有相同的方法名,相同的参数列表,相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新的方法。
如下面的例子:
class FuException extends RuntimeException
{
}
class ZiException extends FuException
{
}
class Fu
{
            Fu method() throws FuException //返回值类型为Fu
          {
                  System.out.println("Fu...");
                  return new Fu();
  
           }
}
class  Zi extends Fu
{
          protected Zi method() throws ZiException  //这里只能抛父异常或者父类的子异常,返回值类型为Zi
         {
             System.out.println("zi....");
             return new Zi();
         }
         public static void main(String[] args)
         {
             Fu f=new Zi();
             f.method();
             System.out.println("Hello World!");
          }
}

回复 使用道具 举报
庄星睿 发表于 2012-8-31 22:11
不能,这样写可以看成是重载,重载是看同名函数的参数列表,而覆盖则是要遵循“两同两小一大”规则,“两同 ...

我记得覆盖是对于两个类,子类中重写父类的方法,从而覆盖了父类的方法,而重载是在一个类中,方法的参数类型和个数不一样,假如在两个类中了,这就不能叫重载了,不是这样吗?
回复 使用道具 举报
   覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回
值类型。
子类的方法返回值类型可以是父类方法返回值类型的子类。如果
在子类中想调用父类中的那个被覆盖的方法,我们可以用“super.方法名”的
格式。
     静态只能覆盖静态。
      只能说形式上静态方法的却可以被重写,实际上达不到重写的效果,
从多态的角度可以认为子类实际上是写了一个新方法,从这个角度上说静
态方法无法被重写。(静态不需要对象,直接可以通过类名调用)
回复 使用道具 举报
函数重载:同一个类中,一个以上的同名函数,参数个数或者参数类型不同即可重载!与返回值类型无关!
函数覆盖:发生在子父类中,子父类方法要一模一样,包括返回值类型、参数。子类函数权限>=父类函数权限。父类该函数不能是私有的,否则子类看不见。
参数的个数或类型 不一样 所以不是覆盖。
回复 使用道具 举报
都不能。
覆盖要求: 除了要求访问权限大于等于父类函数的权限外,其他的要一模一样,建议复制copy 不改动,,,
回复 使用道具 举报
(1)(3)、(2)(4)都不能形成覆盖(覆写)。
覆写要满足以下条件:1、子类方法的名称,参数签名和返回类型必须与父类方法的名称,参数签名和返回类型一致 2、子类方法不能缩小父类方法的访问权限。3、子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类抛出的异常类的子类 4、方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间,在同一个类中方法只能被重载,不能被覆盖。
重载方法满足以下条件:1、方法名相同 2、方法的参数类型,个数,顺序至少有一项不相同 3、方法的返回类型可以不相同 4、方法的修饰符可以不相同。
回复 使用道具 举报
陈莹 发表于 2012-8-31 22:18
我记得覆盖是对于两个类,子类中重写父类的方法,从而覆盖了父类的方法,而重载是在一个类中,方法的参数 ...

重载主要发生在同一个类的多个同名方法之间(是函数名相同,参数列表不同),而覆盖必须发生在子类和父类的同名方法之间(两同两小一大),覆盖一定要有关系,要么继承,要么实现,所以把重载和覆盖放在一起比较没有太大的意义,他们之间的联系很少,二者都是发生在方法之间,并要求方法同名,父类方法和子类方法之间也可能发生重载,因为子类会获得父类方法,如果子类定义了一个非私有,且与父类方法同名,但参数列表不同的方法,就会形成父类方法和子类方法的重载:
class A
{
     void method(int x,int y){}
}
class B extends A
{
    int method(int x,int y,int z){}
}
回复 使用道具 举报
庄星睿 发表于 2012-9-1 09:54
重载主要发生在同一个类的多个同名方法之间(是函数名相同,参数列表不同),而覆盖必须发生在子类和父类 ...

哦哦,明白了,忽略了子类已经继承父类的方法了,谢谢
回复 使用道具 举报
(1)和(3)不能形成重写,(2)和(4)也不能形成重写,(1)和(3)与(2)和(4)都是重载.
重写: 父类与子类的方法名,参数,返回值都必须完全修饰符,不过访问修饰符并不要求完全相同,但是父类方法的访问修饰符的权限一定要比子类方法的访问修饰符的权限要低才可以.要想形成方法重写形式,另外有一点要注意,父类方法的访问方法的访问修饰符不可以为private.
重载: 同一类中的方法(或父类与子类中的方法),方法名必须相同,参数类型,参数顺序和参数个数绝对不能完全相同,这样就能形成方法重载.需要注意的是,方法重载跟返回值和方法的访问修饰符无关.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马