Java 方法覆盖
Java 方法覆盖
在本教程中,我们将通过示例了解 Java 中的方法覆盖。
在上一个教程中,我们学习了继承。继承是一种 OOP 属性,它允许我们从现有类(超类)派生新类(子类)。子类继承了超类的属性和方法。
现在,如果在超类和子类中都定义了相同的方法,那么子类的方法会覆盖超类的方法。这称为方法覆盖。
示例 1:方法覆盖
class Animal {
public void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
@Override
public void displayInfo() {
System.out.println("I am a dog.");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}
输出 :
I am a dog.
在上面的程序中,displayInfo()
Animal 中都存在方法 超类和 Dog 子类。
当我们调用 displayInfo()
使用 d1 object(子类的对象),子类Dog里面的方法 叫做。 displayInfo()
子类的方法覆盖了超类的相同方法。
注意 @Override
的使用 在我们的例子中注释。在 Java 中,注解是我们用来向编译器提供信息的元数据。这里,@Override
注解指定编译器,该注解后面的方法覆盖超类的方法。
不强制使用 @Override
.但是,当我们使用它时,该方法应该遵循所有的覆盖规则。否则编译器会报错。
Java 覆盖规则
- 父类和子类必须具有相同的方法名、相同的返回类型和相同的参数列表。
- 我们不能覆盖声明为
final
的方法 和static
. - 我们应该始终覆盖超类的抽象方法(将在后面的教程中讨论)。
Java 覆盖中的 super 关键字
在 Java 中执行覆盖时出现的一个常见问题是:
我们可以在重写后访问超类的方法吗?
嗯,答案是是的 .要从子类访问超类的方法,我们使用 super
关键字。
示例 2:super 关键字的使用
class Animal {
public void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
public void displayInfo() {
super.displayInfo();
System.out.println("I am a dog.");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}
输出 :
I am an animal. I am a dog.
在上面的例子中,子类 Dog 覆盖方法 displayInfo()
超类 Animal .
当我们调用方法 displayInfo()
使用 d1 狗的对象 子类,Dog里面的方法 子类被调用;超类内部的方法没有被调用。
displayInfo()
里面 狗 子类,我们使用了 super.displayInfo()
调用 displayInfo()
超类的。
需要注意的是,Java 中的构造函数不是继承的。因此,Java 中不存在构造函数重写之类的东西。
但是,我们可以从其子类调用超类的构造函数。为此,我们使用 super()
.要了解更多信息,请访问 Java super 关键字。
方法覆盖中的访问说明符
在超类及其子类中声明的相同方法可以具有不同的访问说明符。但是,有一个限制。
我们只能在提供比超类的访问说明符更大的访问权限的子类中使用那些访问说明符。例如,
假设,一个方法 myClass()
在超类中声明为 protected
.然后,同样的方法 myClass()
在子类中可以是 public
或 protected
,但不是 private
.
示例 3:覆盖中的访问说明符
class Animal {
protected void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
public void displayInfo() {
System.out.println("I am a dog.");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}
输出 :
I am a dog.
在上面的例子中,子类 Dog 覆盖方法 displayInfo()
超类 Animal .
每当我们调用 displayInfo()
使用 d1 (子类的对象),调用子类内部的方法。
请注意,displayInfo()
被声明为 protected
在动物 超类。同样的方法有 public
Dog 中的访问说明符 子类。这是可能的,因为 public
提供比 protected
更大的访问权限 .
重写抽象方法
在 Java 中,抽象类被创建为其他类的超类。而且,如果一个类包含一个抽象方法,则必须重写它。
我们将在后面的教程中详细了解抽象类和抽象方法的覆盖。
java
- Java 运算符
- Java 接口
- Java try-with-resources
- Java 注释
- Java 注释类型
- Java 中的 String Length() 方法:如何通过示例查找
- Java String indexOf() 方法与子字符串和示例
- Java String charAt() 方法及示例
- Java String compareTo() 方法:如何与示例一起使用
- Java String contains() 方法 |用示例检查子字符串
- Java String endsWith() 方法及示例
- Java String replace()、replaceAll() 和 replaceFirst() 方法