《Oracle Java SE编程指南》13-06:方法的覆盖和
2020-04-24 本文已影响0人
AT阿宝哥

内容导航:
- 前言
1、方法覆盖
继承的作用就是复用,即子类直接使用父类的属性和方法。
然而,有些时候,子类希望修改父类的方法的方法体,可以怎么做呢?
第一种做法是子类创建一个不同名字的新方法,实现新的逻辑,然而,这种做法会导致子类依然包含父类中的那个方法,却不应该使用,破坏封装性。
我们希望子类中的方法依然和父类方法的声明形式一样,但是具体方法体却不同,这种做法就叫做方法覆盖。
2、方法覆盖定义及原则
方法覆盖的定义:子类可以重写父类中某一个方法,称为方法覆盖,也称方法重写,是继承中非常重要的知识点。如果子类需要修改从父类继承到的方法的方法体,就可以使用方法覆盖。
方法覆盖的原则:
- 同一作用域
- 同名
- 同参
- 同返回值
- 访问权限不能缩小
示例代码-父类
public class Animal{
String name;
Integer age;
public Animal() {
}
public Animal(String name, Integer age) {
this.name = name;
this.age = age;
}
void run(){
System.out.println("一只"+this.age+"岁的"+ this.name + "在奔跑!~~");
}
void sound(){
System.out.println("一只"+this.age+"岁的"+ this.name + "在吼叫!~~");
}
}
示例代码-子类:
public class Tiger extends Animal{
String color;
public Tiger(String name,Integer age,String color){
super(name,age);
this.color = color;
}
void hunt(){
System.out.println("一只"+this.color+"的"+ this.name + "在捕猎!~~");
}
void sound(){
System.out.print("我是一只老虎~");
super.sound();
}
}
此处可以提使用tigerSound()方法,而不使用方法覆盖的方式,sound()会被tiger类继承,这违反了面向对象的封装性特征。对象封装了属性和方法,对象的属性和方法都是该对象可以使用的。因此,上面的方法虽然实现了新算法,却存在严重漏洞,破坏了对象的封装性。如果子类需要修改自父类继承到的新方法,可以使用“方法覆盖”来完成。在子类中,声明一个与父类同名、同参、同返回值类型、访问权限不缩小的方法,就可以将父类中的方法覆盖。子类对象调用该方法,将自动绑定到子类覆盖后的新方法。
方法覆盖-代码示例
示例代码-测试类
public class Tester {
public static void main(String[] args) {
Tiger t = new Tiger("东北虎",1,"白色");
t.sound();
}
}
运行结果:
我是一只老虎~一只1岁的东北虎在吼叫!~~
持续更新,欢迎留言提议!
码字很累,多点赞多赞赏!
