20180312 java java面向对象-方法覆盖
场景:
当父类的方法不适合子类的特征的时候,应该采取方法覆盖:
eg:
class Bird{
public void fly{
System.out.println("飞");
}
}
//企鹅类
class Penguin extends Bird{
//重新定义了fly()
public void fly{
System.out.println("我不会飞");
}
}
class OverrideDemo{
public void static main(String[] args)
{
//创建一个企鹅对象,并调用其飞翔的方法
Penguin p = new Penguin();
//先从子类中去寻找fly方法,若找到就执行
//若找不到就去父类中区寻找fly方法
p.fly();//输出 "我不会飞" ,这就是覆盖
}
}
只有方法才有覆盖的概念。又叫方法的复写,又叫方法的覆写,英文叫override。
方法覆盖的原则(一同两小一大):
一同:1、实例方法的签名必须相同(方法签名= 方法名+方法的参数列表),即覆盖函数与被覆盖函数,只能函数体不同。
两小:2、子类方法的返回值类型是和父类方法的返回类型相同或者是其子类,即子类可以返回一个更加具体的类,如,子类和父类都返回int型数据;或父类返回Object类型,而子类返回String类型的数据(String是Object是子类,即子类返回一个更加具体的类),但该方法不常用。
3、子类方法声明抛出的异常类型和父类方法声明抛出的异常类型相同或者是其子类。
4、子类方法的访问权限比父类方法的访问权限要更大或相等,例如:
eg1:(可以)//父类
protected void fly{}
//子类
public void fly{}
eg2:(可以)
//父类
protected void fly{}
//子类
protected void fly{}
eg3:(不可以)//父类
public void fly{}
//子类
private void fly{}
eg4:(不可以)//父类
private void fly{}
//子类
private void fly{}
判断是否是方法覆盖的必杀技:在覆盖函数(子类函数)上一行写 @override:若方法是覆盖方法,则会编译通过,否则会编译报错。
eg://父类
private void fly{}
//子类
@override//"@override"会检查子类中的fly是
//否为覆盖方法,并在编译期给出提示信息,
//仅在java5以上的系统中支持该判断语句
private void fly{}
只有方法有覆盖的概念,字段没有覆盖的概念。