Java的類與繼承
大家都知道,Java是一門物件導向的設計語言,只有存在類,才能體現物件導向程式設計這一特徵。那麼,究竟什麼是類呢?
1.從概念上區分:類、物件、屬性
類:①通過對多個相同型別的物件進行分析,把物件抽象成類,也就是說具有相同特性和行為的物件的抽象就是類;
②類是一種引用資料型別;
③並不是說所有的類都具有屬性與方法;
④類可以建立多個物件。
物件:①物件是類的示例,類是物件的模板;
②要想使用類中定義的方法或屬性,首先要宣告類的物件。當然,被static修飾的可以直接用類名來呼叫;
③通過類的物件呼叫類的屬性與方法;
④類的物件具有類中定義的所有方法與屬性,物件有可以成為例項;
⑤物件的屬性的初始值與類的屬性的預設值是一致的。
屬性:①用於區分物件,它是物件具有的特徵;
②類的屬性又成為例項變數;
③類的屬性在沒有賦值的情況下存在預設值。
1)對於 char、short、byte、int、long、float、double等基本資料型別的變數來說會預設初始化為0(float、double預設初始化為0.0,boolean變數預設會被初始化為false);
2)對於引用型別的變數(String型別、陣列、自定義的類等),會預設初始化為null。
關於構造方法
如果在類的內部沒有顯示定義一個構造方法,則編譯器會在執行時自動建立一個無參(引數列表為空、方法體為空)的構造方法。但是,如果顯示定義了構造方法,編譯器就不會自動新增構造方法。並且,所有的構造方法預設為static的。
構造方法存在的意義
建立類的物件並初始化成員變數。構造方法唯一的呼叫方式就是在建立類的物件的時候,當前是通過new關鍵字來建立物件。
下面具體說明一下類的初始化物件:
在程式執行時,需要生產某個類的物件,JVM首先會先檢查是否加已經載入了這個類。如果已經載入,則直接生成類的物件;如果尚未載入,則會先執行類的載入再去生成物件。
在類的載入過程中,類的static成員變數會被初始化。另外,如果類中有static語句塊,則會執行static語句塊,並且static語句塊在第一次使用類之前自動執行而且只執行一次。
static成員變數和static語句塊的執行順序同程式碼中的順序一致。記住,在Java中,類是按需載入,只有當需要用到這個類的時候,才會載入這個類,並且只會載入一次。
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Bread bread1 = new Bread();
Bread bread2 = new Bread();
}
}
class Bread {
static{
System.out.println("Bread is loaded");
}
public Bread() {
System.out.println("bread");
}
}
執行結果:
Bread is loaded
bread
bread
"Bread is loaded"只會被列印一次。
在生成物件的過程中,會先初始化物件的成員變數,然後再執行構造器。也就是說類中的變數會在任何方法(包括構造器)呼叫之前得到初始化,即使變數散步於方法定義之間。
public class Test {
public static void main(String[] args) {
new Meal();
}
}
class Meal {
public Meal() {
System.out.println("meal");
}
Bread bread = new Bread();
}
class Bread {
public Bread() {
System.out.println("bread");
}
}
執行結果:
bread
meal
2.有關繼承
特徵:①繼承就是在已存在的類的基礎上擴充套件產生新的類;
②繼承的目的是實現程式碼的複用;
③繼承可以多層繼承,但繼承只能有一個直接父類;
④繼承具有傳遞性與單根性;
⑤一旦實現繼承,那麼子類具有父類與間接父類的屬性和方法;
⑥使用extends關鍵字實現繼承;
⑦子類可以使用父類的屬性和方法,但父類不能使用子類的屬性和方法;
⑧在Java中如果沒有使用extends關鍵字來顯示宣告一個類的父類時,那麼當前類的父類時java.lang.Object;
⑨子類可以根據需要重寫父類中的方法,重寫要求方法簽名(訪問修飾符、返回型別、方法名、引數列表)相同;
⑩子類中通過super關鍵字呼叫父類的屬性與方法;
建立子類物件時會優先建立父類物件,預設呼叫無參無方法體的構造方法。
如果父類沒有無引數的構造方法,那麼子類構造方法中必須指明呼叫父類哪個構造方法來建立父類的物件。
通過super(引數列表)的形式在子類構造方法中呼叫父類的構造方法,該程式碼必須是子類構造方法的第一行。
舉個例子:
class Person {
public Person() {
}
}
class Man extends Person {
public Man() {
}
}
類Man繼承於Person類,這樣一來的話,Person類稱為父類(基類),Man類稱為子類(匯出類)。如果兩個類存在繼承關係,則子類會自動繼承父類的方法和變數,在子類中可以呼叫父類的方法和變數。在java中,只允許單繼承,也就是說 一個類最多隻能顯示地繼承於一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。
1.子類繼承父類的成員變數
當子類繼承了某個類之後,便可以使用父類中的成員變數,但是並不是完全繼承父類的所有成員變數。具體的原則如下:
1)能夠繼承父類的public和protected成員變數;不能夠繼承父類的private成員變數;
2)對於父類的包訪問許可權成員變數,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3)對於子類可以繼承的父類成員變數,如果在子類中出現了同名稱的成員變數,則會發生隱藏現象,即子類的成員變數會遮蔽掉父類的同名成員變數。如果要在子類中訪問父類中同名成員變數,需要使用super關鍵字來進行引用。
2.子類繼承父類的方法
同樣地,子類也並不是完全繼承父類的所有方法。
1)能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;
2)對於父類的包訪問許可權成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3)對於子類可以繼承的父類成員方法,如果在子類中出現了同名稱的成員方法,則稱為覆蓋,即子類的成員方法會覆蓋掉父類的同名成員方法。如果要在子類中訪問父類中同名成員方法,需要使用super關鍵字來進行引用。
注意:隱藏和覆蓋是不同的。隱藏是針對成員變數和靜態方法的,而覆蓋是針對普通方法的。
3.構造器
子類是不能夠繼承父類的構造器,但是要注意的是,如果父類的構造器都是帶有引數的,則必須在子類的構造器中顯示地通過super關鍵字呼叫父類的構造器並配以適當的引數列表。如果父類有無參構造器,則在子類的構造器中用super關鍵字呼叫父類構造器不是必須的,如果沒有使用super關鍵字,系統會自動呼叫父類的無參構造器。看下面這個例子就清楚了:
class Shape {
protected String name;
public Shape(){
name = "shape";
}
public Shape(String name) {
this.name = name;
}
}
class Circle extends Shape {
private double radius;
public Circle() {
radius = 0;
}
public Circle(double radius) {
this.radius = radius;
}
public Circle(double radius,String name) {
this.radius = radius;
this.name = name;
}
}
這樣的程式碼是沒有問題的,如果把父類的無參構造器去掉,則下面的程式碼必然會出錯:
改成下面這樣就行了:
4.super關鍵字
super主要有兩種用法:
1)super.成員變數/super.成員方法;
2)super(parameter1,parameter2....)
第一種用法主要用來在子類中呼叫父類的同名成員變數或者方法;第二種主要用在子類的構造器中顯示地呼叫父類的構造器,要注意的是,如果是用在子類構造器中,則必須是子類構造器的第一個語句。
相關文章
- Java:類與繼承Java繼承
- Java中的類繼承與多型Java繼承多型
- 類的繼承_子類繼承父類繼承
- 繼承 基類與派生類繼承
- java容器類的繼承結構Java繼承
- 類的繼承繼承
- Java基礎10 介面的繼承與抽象類Java繼承抽象
- Java之繼承和抽象類Java繼承抽象
- JAVA介面繼承、抽象類等Java繼承抽象
- ES6 - 類與繼承繼承
- JavaScript基礎: 類與繼承JavaScript繼承
- 菱形繼承與虛基類繼承
- java繼承與多型Java繼承多型
- 類的組合與繼承——作業繼承
- python 類的繼承與過載Python繼承
- Java中的繼承與組合Java繼承
- Java的繼承Java繼承
- Java程式碼塊與Java繼承Java繼承
- Java類是如何預設繼承Object的?Java繼承Object
- JS原型繼承和類式繼承JS原型繼承
- 課時38:類與物件:繼承物件繼承
- 多繼承 與 多重繼承繼承
- Java 自學 - 介面與繼承 介面Java繼承
- javascript類繼承JavaScript繼承
- Java類(繼承)初始化順序Java繼承
- Java中介面與繼承的區別Java繼承
- Java繼承Java繼承
- Python類的繼承Python繼承
- 類的繼承圖解繼承圖解
- Swift—類的繼承-備Swift繼承
- 類的繼承和派生繼承
- Java繼承的使用Java繼承
- java中的繼承Java繼承
- oop類的繼承與類靜態成員學習OOP繼承
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- [打牢基礎系列]JavaScript的類與繼承JavaScript繼承
- Java 繼承與多型實驗Java繼承多型
- TypeScript 介面繼承類TypeScript繼承