Java是一種面向對象的編程語言,就像其他面向對象的語言一樣,Java也支持類的繼承。類的繼承是面向對象編程的重要概念之一,它允許一個類繼承另一個類的屬性和方法,同時還可以定義新的屬性和方法。
一、基本概念
在Java中,類的繼承是通過使用關鍵字extends來實現的。在定義一個類時,可以使用extends關鍵字來指定該類繼承自另一個類。被繼承的類稱為父類或者超類,繼承該類的類稱為子類或者派生類。在Java中,只能單繼承,即一個子類只能繼承一個父類。
下面是一個簡單的例子:
class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { void bark() { System.out.println("Dog is barking"); } } public class Test { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); dog.bark(); } }
在上面的例子中,Animal是父類,Dog是子類。Dog繼承了Animal的eat()方法並新增了bark()方法。在main()方法中,可以看到Dog對象可以調用eat()和bark()方法。
二、構造方法
當一個類被繼承時,子類會繼承父類的所有屬性和方法,但是不會繼承構造方法。子類必須調用父類的構造方法來初始化繼承的屬性。Java提供了兩種方式來調用父類的構造方法:
- 使用super關鍵字調用父類的構造方法。
- 如果子類沒有調用任何父類構造方法,則會默認調用父類的無參構造方法。
下面是一個例子:
class Animal { String name; Animal(String name) { this.name = name; } } class Dog extends Animal { int age; Dog(String name, int age) { super(name); this.age = age; } } public class Test { public static void main(String[] args) { Dog dog = new Dog("Tom", 2); System.out.println(dog.name + " is " + dog.age + " years old"); } }
在上面的例子中,Animal有一個有參構造方法,Dog調用了父類的構造方法並初始化了自己的屬性。
三、方法重寫
當子類繼承父類後,如果子類需要修改繼承的方法的實現,可以使用方法重寫。方法重寫也稱為方法覆蓋或者方法複寫。方法重寫用於改變繼承方法的行為,但是不改變繼承方法的方法名、參數列表、返回值類型。
下面是一個例子:
class Animal { void move() { System.out.println("Animal is moving"); } } class Dog extends Animal { void move() { System.out.println("Dog is running"); } } public class Test { public static void main(String[] args) { Animal animal = new Animal(); Dog dog = new Dog(); animal.move(); dog.move(); } }
在上面的例子中,Animal有一個move()方法,Dog重寫了該方法並改變了實現。在main()方法中,可以看到Animal和Dog調用的move()方法實現不同。
四、抽象類和接口
抽象類和接口都是面向對象編程的重要概念,它們可以被繼承。抽象類可以被繼承並且可以包含抽象方法,抽象方法是沒有方法體的方法,子類必須重寫這些方法。接口也可以被繼承,但是接口中的方法只有方法頭,沒有方法體,子類必須實現這些方法。
下面是一個例子:
// 抽象類 abstract class Animal { abstract void move(); } // 實現抽象類 class Dog extends Animal { void move() { System.out.println("Dog is running"); } } // 接口 interface Speakable { void speak(); } // 實現接口 class Cat implements Speakable { void speak() { System.out.println("Cat is speaking"); } } public class Test { public static void main(String[] args) { Dog dog = new Dog(); Cat cat = new Cat(); dog.move(); cat.speak(); } }
在上面的例子中,Animal是一個抽象類,Dog實現了它並重寫了move()方法。Speakable是一個接口,Cat實現了它並實現了speak()方法。
五、多態
多態是面向對象編程的重要概念之一,它允許使用父類的引用來指向子類的對象。通過多態,可以動態的選擇調用哪個子類的方法。多態必須滿足的條件是:繼承、方法重寫、父類引用指向子類對象。
下面是一個例子:
class Animal { void move() { System.out.println("Animal is moving"); } } class Dog extends Animal { void move() { System.out.println("Dog is running"); } } class Cat extends Animal { void move() { System.out.println("Cat is jumping"); } } public class Test { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.move(); animal2.move(); } }
在上面的例子中,Animal是父類,Dog和Cat都是Animal的子類。在main()方法中,animal1和animal2都是Animal類型的引用,但是它們分別指向了Dog和Cat類型的對象。在調用move()方法時,會動態的選擇調用哪個子類的方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/249058.html