Java類的繼承是面向對象編程中最重要和最基本的概念之一。繼承的概念是指一個類從另外一個類獲取屬性和方法,而被獲取的類稱為父類或超類,使用該屬性和方法的類稱為子類或派生類。在本篇文章中,我們將全面介紹Java類的繼承,從基本概念開始到高級應用,提供豐富的代碼示例和詳細解析,讓讀者輕鬆掌握Java類繼承的所有知識。
一、基本概念
1.1 父類與子類
在Java中,一個類可以通過extends關鍵字繼承另一個類的屬性和方法。被繼承的類稱為父類或超類,繼承的類稱為子類或派生類。例如:
public class Animal {
protected String name;
protected int age;
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println("Dog is barking.");
}
}
在這個例子中,Animal是Dog的父類,Dog是Animal的子類。Dog繼承了Animal的name和age屬性,同時也繼承了eat()方法。
1.2 繼承層次結構
Java中支持多級繼承,即一個子類可以通過繼承多個父類來獲取更多的屬性和方法。這樣就形成了繼承層次結構。例如:
public class Animal {
protected String name;
protected int age;
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println("Dog is barking.");
}
}
public class GoldenRetriever extends Dog {
public void fetch() {
System.out.println("Golden Retriever is fetching.");
}
}
在這個例子中,GoldenRetriever是Dog的子類,同時也是Animal的子類。GoldenRetriever繼承了Dog的bark()方法和Animal的name和age屬性以及eat()方法。
1.3 protected關鍵字
protected關鍵字用於控制屬性和方法的訪問範圍,被protected修飾的屬性和方法可以被子類繼承和訪問,但不能被其他包中的類訪問。例如:
public class Animal {
protected String name;
protected int age;
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
public void bark() {
System.out.println("Dog is barking.");
}
}
public class Labrador extends Dog {
public void swim() {
System.out.println("Labrador is swimming.");
}
}
public class Main {
public static void main(String[] args) {
Labrador labrador = new Labrador();
labrador.name = "Max"; // 可以訪問父類的protected屬性
labrador.age = 3;
System.out.println(labrador.name + " is " + labrador.age + " years old.");
}
}
在這個例子中,Labrador繼承了Animal和Dog的protected屬性name和age,可以使用labrador.name和labrador.age來訪問。但是在Main類中,無法訪問Labrador的name和age屬性。
二、繼承的常見問題
2.1 父類構造函數
在Java中,子類的構造函數默認會調用父類的無參構造函數。如果父類沒有無參構造函數,子類需要顯式地調用父類的構造函數。例如:
public class Animal {
protected String name;
protected int age;
public Animal(String n, int a) {
name = n;
age = a;
}
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
public Dog(String n, int a) {
super(n, a); // 顯式調用父類的構造函數
}
public void bark() {
System.out.println("Dog is barking.");
}
}
在這個例子中,Animal類的構造函數需要定義兩個參數,所以Dog類的構造函數中需要顯式調用父類的構造函數。
2.2 方法重寫
方法重寫是指子類重新定義了父類已有的方法,使得子類的方法版本覆蓋了父類的方法版本。在Java中,使用@Override註解可以標記一個方法是重寫父類方法的。例如:
public class Animal {
protected String name;
protected int age;
public Animal(String n, int a) {
name = n;
age = a;
}
public void eat() {
System.out.println("Animal is eating.");
}
}
public class Dog extends Animal {
public Dog(String n, int a) {
super(n, a);
}
public void eat() {
System.out.println("Dog is eating.");
}
public void bark() {
System.out.println("Dog is barking.");
}
}
在這個例子中,Dog重寫了Animal的eat()方法,並且使用@Override註解加以標記。在調用Dog的eat()方法時,將會輸出“Dog is eating.”而不是“Animal is eating.”。
2.3 super關鍵字
super關鍵字用於在子類中訪問父類的成員變量和成員方法。例如:
public class Animal {
protected String name;
protected int age;
public Animal(String n, int a) {
name = n;
age = a;
}
public void eat() {
System.out.println("Animal is eating.");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
private String barkSound;
public Dog(String n, int a, String b) {
super(n, a);
barkSound = b;
}
public void bark() {
System.out.println("Dog is barking " + barkSound + ".");
}
public void getName() {
System.out.println("The dog's name is " + super.getName() + ".");
}
}
在這個例子中,Dog類中的getName()方法重寫了Animal類中的getName()方法,並且在方法中使用super關鍵字來訪問父類的getName()方法,輸出“The dog’s name is Max.”。
三、繼承的高級應用
3.1 接口與抽象類
接口和抽象類都是Java中用於實現類似多繼承的方法。接口可以理解為一種規範,它定義了一些方法的簽名,不包含方法的實現。類實現接口時必須實現接口中定義的所有方法。抽象類則是一種中介形態,它可以定義一些成員變量和方法,但方法不需要全部實現。子類繼承抽象類後,必須實現抽象類中未實現的方法。例如:
public interface Swim {
public void swim();
}
public abstract class Animal {
protected String name;
protected int age;
public Animal(String n, int a) {
name = n;
age = a;
}
public void eat() {
System.out.println("Animal is eating.");
}
public abstract void makeSound(); // 抽象方法
public abstract void move(); // 抽象方法
}
public class Dog extends Animal implements Swim {
private String barkSound;
public Dog(String n, int a, String b) {
super(n, a);
barkSound = b;
}
public void bark() {
System.out.println("Dog is barking " + barkSound + ".");
}
public void makeSound() {
System.out.println("Dog is making sound.");
}
public void move() {
System.out.println("Dog is moving.");
}
public void swim() {
System.out.println("Dog is swimming.");
}
}
在這個例子中,Swim是一個接口,定義了一個swim()方法。Animal是一個抽象類,其中定義了兩個抽象方法makeSound()和move()。Dog繼承了Animal並且實現了Animal中的兩個抽象方法以及Swim接口中的swim()方法。
3.2 其他高級應用
除了接口和抽象類之外,Java中還有一些其他的高級繼承應用,例如final類和final方法。final類表示該類不能被繼承,final方法表示該方法不能被重寫。
public final class Animal {} // final類
public class Dog {
public final void bark() {} // final方法
}
四、總結
Java類的繼承是面向對象編程中最重要和最基本的概念之一。一個類可以通過extends關鍵字繼承另一個類的屬性和方法。被繼承的類稱為父類或超類,繼承的類稱為子類或派生類。Java中支持多級繼承,即一個子類可以通過繼承多個父類來獲取更多的屬性和方法。使用protected關鍵字可以控制屬性和方法的訪問範圍。子類需要顯式地調用父類的構造函數。方法重寫是指子類重新定義了父類已有的方法,使用@Override註解可以標記一個方法是重寫父類方法的。使用super關鍵字可以在子類中訪問父類的成員變量和成員方法。除了接口和抽象類之外,Java中還有一些其他的高級繼承應用,例如final類和final方法。
原創文章,作者:ZNQH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/135407.html
微信掃一掃
支付寶掃一掃