1. 程式人生 > >java基礎(九)繼承

java基礎(九)繼承

關鍵字: extends

為什麼存在:

多個類存在相同屬性和行為,將其放在一個父類中,其餘的類只需要繼承就行。
提高程式碼複用性

格式:

class 子類名 extends 父類名{}

eg:

Person類:

public class Person {
	private int age;
	private String name;
	
	public static void eat(){
		System.out.println("吃飯");
	}
}

Student:

public class Student extends Person
{ }

Main:

public class ExtendsDemo {
	public static void main(String[] args) {
		Student st = new Student();
		st.eat();
	}
}

好處:

  1. 提高程式碼複用性
  2. 子類還可以在父類的基礎上新增新成員
  3. 提高程式碼的維護性
  4. 讓類與類之間產生關係,是多型的前提
    (這也是弊端,類與類的耦合性很高)

弊端:

  1. 高耦合
  2. 可以打破封裝性

拓展:

開發原則:低耦合,高內聚

耦合:類與類的關係

內聚:就是自己完成某件事情的能力

Java中繼承的特點

  1. java中只支援繼承,不支援多繼承
class zilei extends fulei,fulei2{} //這種不允許
  1. 但支援多層繼承
class a 
class b extends a{}
class c extends b{}

Java中繼承的注意事項

  1. 子類不能繼承父類的私有成員方法
    繼承非私有方法,裡面如果有私有變數也可以。(打破封裝性)
    Person類:
public class Person {
	private int age;
	private String name;
public static void eat(){ System.out.println(age); //私有成員變數age } }

Student:

public class Student extends Person{
}

Main:

public class ExtendsDemo {
	public static void main(String[] args) {
		Student st = new Student();
		st.eat();
	}
}
  1. 子類不能繼承父類的私有成員變數
  2. 子類不能繼承父類的構造方法,只能通過super關鍵字訪問
  3. 不要為了部分功能就去繼承

繼承適用場景:

繼承體現的是一種關係: “is a”

假設法
當設計的時候需要你去分析:
比如有張三,李四類,張三 is a Person;李四 is a Person
比如有香蕉,蘋果類,香蕉 is a 水果;蘋果 is a 水果

那就是說如果你覺得ab都屬於c的一種,就可以使用繼承


繼承中成員變數的關係

  1. 父類中成員變數名稱與子類的不同:不衝突

  2. 若相同,變數就近原則。變數值為子類中的值

既輸出區域性範圍的變數,還要輸出本類成員範圍中的變數:

父類:

public class Father {
	int num = 100;
}

子類:

public class Son extends Father{	
	int num = 50;
	
	public void show(){
		int num = 10;
		System.out.println(num);
		System.out.println(this.num);
		System.out.println(super.num);
	}

}

Main:

public class ExtendsDemo2 {
	public static void main(String[] args) {
		Son son = new Son();
		son.show();
	}
	
}

輸出為:

10 //輸出的是最近的方法體中的num
50//輸出的是son類中的num
100//輸出的是父類中的num
關鍵字 尋值範圍
this.num 本類中>父類
super.unm 父類
num 方法體>本類>父類

繼承中構造方法的方法

  1. 子類中所有構造方法執行前都會預設訪問父類中無參構造方法
  2. 為什麼:子類會繼承父類資料,所以子類初始化之前,一定要完成父類資料的初始化

子類的每個構造方法第一句都是:super(); 不寫也會預設有

public class Student extends Person{
	public Student(){
		super();
	}
}

super(); 可以訪問父類的帶參構造方法