标题: 覆盖的问题 [打印本页] 作者: 黑马--张帅 时间: 2012-8-31 21:58 标题: 覆盖的问题 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)是否能形成覆盖?能形成覆盖的话,为什么? 作者: 庄星睿 时间: 2012-8-31 22:11
不能,这样写可以看成是重载,重载是看同名函数的参数列表,而覆盖则是要遵循“两同两小一大”规则,“两同”指方法名相同,形参列表相同;“两小”指子类方法的返回值类型比
父类方法的返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是
子类方法的访问权限应该比父类方法的访问权限更大或相等。
注意: 静态只能覆盖静态,如果父类方法具有 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!");
}
}
重载主要发生在同一个类的多个同名方法之间(是函数名相同,参数列表不同),而覆盖必须发生在子类和父类的同名方法之间(两同两小一大),覆盖一定要有关系,要么继承,要么实现,所以把重载和覆盖放在一起比较没有太大的意义,他们之间的联系很少,二者都是发生在方法之间,并要求方法同名,父类方法和子类方法之间也可能发生重载,因为子类会获得父类方法,如果子类定义了一个非私有,且与父类方法同名,但参数列表不同的方法,就会形成父类方法和子类方法的重载:
class A
{
void method(int x,int y){}
}
class B extends A
{
int method(int x,int y,int z){}
} 作者: 陈莹 时间: 2012-9-1 10:03