1、方法的重写(Override)
当子类对从父类继承的方法实现(方法体)不满意时,
或者说,子类对某个方法的实现有更进一步的改良,子类完全可以重写这个方法。
重写的意思就是重新实现这个方法,就是在子类重新编写该方法的方法体
2、IDEA中如何重写父类的某个方法呢?
光标定位在子类要写方法的位置,按快捷键。
快捷键:Ctrl + O
3、当通过子类对象调用重写的方法时,肯定是执行重写后的代码。
4、当在子类重写方法的方法体中,想要继续执行父类被重写方法的方法体
可以通过“super.父类被重写方法名(..)"
5、重写方法有要求:
(1)方法名:必须相同
(2)形参列表:必须相同
(3)返回值类型:
基本数据类型和void,必须相同
引用数据类型:<=
Java中的子类<父类,这个是从类表示的事物范围角度来说的。
子类重写的方法的返回值类型可以和父类被重写方法的返回值类型一样。
子类重写的方法的返回值类型可以是父类被重写方法的返回值类型的子类。
(4)权限修饰符:
首先,子类要重写父类的某个方法,要求该方法必须在子类是可见。
意味着的private的方法,在子类是不能被重写。
跨包的子类,权限修饰符缺省的方法,在子类中也是不能被重写。
其次,子类重写父类的方法时,权限修饰符必须满足>=的关系
对比方法的重载:
方法名:必须相同
形参列表:必须不同
返回值类型:无关
public class TestOverride {
public static void main(String[] args) {
//调用重写后的方法
Smartphone sp = new Smartphone();
sp.showNumber();
//显示头像
//显示名称
//super后 显示来电号码
}
}
public class Phone {
protected String name;
protected double price;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public double getPrice() {return price;}
public void setPrice(double price) {this.price = price;}
public void sendMessage(){
System.out.println("发短信");
}
public void call(){
System.out.println("打电话");
}
public void showNumber(){
System.out.println("显示来电号码");
}
protected Person getOwner(){
return new Person();//具体功能省略了
}
}
public class Smartphone extends Phone {
public void showFunction(){
sendMessage();
call();
showNumber();
}
@Override
public void showNumber() {
//重写的意思,就是重新实现这个方法,就是重新编写方法体
System.out.println("显示头像");
System.out.println("显示名称等");
//想要继续保留父类被重写的功能:显示来电号码
super.showNumber();
}
@Override
public Father getOwner() {
return new Father();
}
}