一、繼承的概念
繼承是面向對象編程中的一個重要概念。它允許我們創建新的類(子類),從已有的類(父類)中繼承其屬性和方法。這樣,子類就具有了父類的所有屬性和方法,還可以在此基礎上添加些許新的屬性和方法。
Java中,默認情況下,每個類都是Object類的子類,因此Java中大多數類都繼承了Object提供的屬性和方法。
二、Java中繼承的實現
在Java中,繼承可以通過「extends」關鍵字來實現,使用該關鍵字後,子類可以從父類中繼承所有的非私有(private)屬性和方法。
// 定義父類Person
public class Person {
public String name;
public int age;
public void sayHello() {
System.out.println("Hello, I am " + name);
}
}
// 定義子類Student,繼承Person
public class Student extends Person {
public String school;
public void study() {
System.out.println(name + " is studying in " + school);
}
}
// 測試,從Student中調用繼承自Person中的方法和屬性
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.name = "Li Lei";
student.age = 18;
student.school = "No.1 High School";
student.sayHello(); // Hello, I am Li Lei
student.study(); // Li Lei is studying in No.1 High School
}
}
三、訪問修飾符對繼承的影響
Java中有四個訪問修飾符:public、protected、default、private。它們的作用範圍不同,如果使用不當,會對繼承產生影響。
1. public
使用public修飾的屬性和方法可以被子類直接訪問,例如:
// 父類Student中使用public修飾的屬性和方法
public class Person {
public String name;
public int age;
public void sayHello() {
System.out.println("Hello, I am " + name);
}
}
// 子類Student中直接訪問繼承自父類Person中使用public修飾的屬性和方法
public class Student extends Person {
public void sayHelloToTeacher() {
System.out.println("Hello, Teacher");
sayHello(); // 調用繼承自Person中使用public修飾的方法
System.out.println("My name is " + name); // 訪問繼承自Person中使用public修飾的屬性
}
}
2. protected
使用protected修飾的屬性和方法可以被子類訪問,但是對於子類的外部類或無關類是不可見的。這意味着,子類可以在子類內部或其子類內部使用父類中的受保護成員,但是在子類外部不可使用。
// 父類Person中使用protected修飾的屬性和方法
public class Person {
protected String name;
protected int age;
protected void sayHello() {
System.out.println("Hello, I am " + name);
}
}
// 子類Student中調用繼承自父類Person中使用protected修飾的方法
public class Student extends Person {
public void sayHelloToTeacher() {
System.out.println("Hello, Teacher");
sayHello(); // 調用繼承自Person中使用protected修飾的方法
System.out.println("My name is " + name); // 訪問繼承自Person中使用protected修飾的屬性
}
}
// 無關類中無法訪問繼承自Person中使用protected修飾的屬性和方法
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.name = "Tom"; // 編譯錯誤,無法訪問使用protected修飾的屬性
person.sayHello(); // 編譯錯誤,無法訪問使用protected修飾的方法
}
}
3. default
不使用訪問修飾符,即使用默認訪問修飾符聲明的屬性和方法,對於子類和同一包中的其他類都是可見的。但是,對於不在同一包中的類,使用default修飾的屬性和方法都是不可見的。
// 父類Person中使用默認訪問修飾符聲明的屬性和方法
public class Person {
String name;
int age;
void sayHello() {
System.out.println("Hello, I am " + name);
}
}
// 子類Student中會繼承從父類Person中使用default訪問修飾符聲明的屬性和方法
public class Student extends Person {
public void sayHelloToTeacher() {
System.out.println("Hello, Teacher");
sayHello(); // 調用繼承自Person中使用default訪問修飾符聲明的方法
System.out.println("My name is " + name); // 訪問繼承自Person中使用default訪問修飾符聲明的屬性
}
}
// 另一個類,在同一包中可以訪問使用default訪問修飾符聲明的屬性和方法
public class AnotherClass {
public void test(Person person) {
person.name = "Alex"; // 可以訪問使用default訪問修飾符聲明的屬性
person.sayHello(); // 可以訪問使用default訪問修飾符聲明的方法
}
}
// 不在同一包中的類無法訪問使用default訪問修飾符聲明的屬性和方法
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.name = "Tom"; // 編譯錯誤,無法訪問使用default訪問修飾符聲明的屬性
person.sayHello(); // 編譯錯誤,無法訪問使用default訪問修飾符聲明的方法
}
}
4. private
使用private修飾的屬性和方法只能被該類的內部訪問,其他類無法訪問。因此,私有成員是不可繼承的,子類中無法訪問父類的私有屬性和方法。
// 父類Person中使用private修飾的屬性和方法
public class Person {
private String name;
private int age;
private void sayHello() {
System.out.println("Hello, I am " + name);
}
}
// 子類Student中無法訪問從父類Person中繼承的私有成員
public class Student extends Person {
public void sayHelloToTeacher() {
System.out.println("Hello, Teacher");
sayHello(); // 編譯錯誤,無法訪問繼承自Person中的私有方法
System.out.println("My name is " + name); // 編譯錯誤,無法訪問繼承自Person中的私有屬性
}
}
四、super關鍵字
在子類中如果想要調用父類中的方法或屬性,可以使用super關鍵字。使用super關鍵字可以訪問父類的成員變量和成員方法,並且可以調用父類的構造函數。
// 父類Person中的構造函數
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
// 子類Student中使用super關鍵字訪問父類的構造函數
public class Student extends Person {
public String school;
public Student(String name, int age, String school) {
super(name, age); // 調用父類的構造函數
this.school = school;
}
}
// 測試
public class Test {
public static void main(String[] args) {
Student student = new Student("Li Lei", 18, "No.1 High School");
System.out.println(student.name); // 輸出:"Li Lei"
System.out.println(student.age); // 輸出:18
System.out.println(student.school); // 輸出:"No.1 High School"
}
}
五、總結
繼承是面向對象編程中的重要概念,它允許子類繼承父類的所有屬性和方法,並且可以在此基礎上添加些許新的屬性和方法。在Java中,使用extends關鍵字可以實現繼承,子類可以從父類中繼承所有的非私有屬性和方法。在使用過程中,訪問修飾符對於繼承有一定的影響,如public修飾的屬性和方法可以被子類直接訪問,而private修飾的成員是不可繼承的。使用super關鍵字可以訪問父類的構造函數和成員變量,同時也可以調用父類的方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/250489.html
微信掃一掃
支付寶掃一掃