package cn.gg.oo2;
public class TestOverride {
public static void main(String[] args){
Horse h = new Horse();
h.run();
}
}
class Vehicle{
public void run(){
System.out.println("跑..跑..跑..");
}
public void stop(){
System.out.println("停!!");
}
public Person WhoIsPsg(){
return new Person();
}
}
class Horse extends Vehicle{
public void run(){
System.out.println("四蹄翻飞,得得得...");
}
public Boy WhoIsPsg(){//返回值小于等于父类的类型,虽然语言上说是父亲大于孩子,但 是 孩子继承了父亲后可以后父亲没有的方法和属性,所以返回值只能范围更广,而不能更小
return new Boy();//如果父类和子类中的Person和Boy交换,会报错,返回值无法兼容
}
}
方法的重写需要符合下面的三个要点: 1.“==”: 方法名、形参列表相同。也就是说如果不一样,比如在Horse 类里定义的方法run改为run1,那么会造成在main函数里调用时run就是调用的父类Vehicle里的run。也就是说,方法名、形参名之一有不同,则相当于子类在继承父类的基础上重新写了一个方法,并不是“重写”。 2.“≤”:返回值类型和声明异常类型,子类小于等于父类。
Horse继承了Vehicle,Horse里有Vehicle类中没有的部分;所以在Horese重写的时候,返回值的类型也必须有类似父子关系的继承关系 3.“≥”: 访问权限,子类大于等于父类