Java基礎 類的繼承關係
技術標籤:java程式設計自學java
Java類的擴充套件
*當我們建立一個Java project,這個專案名和包都可以命名為demo,在這個包中建立我們需要的類,來完成某些功能。但這遠遠不夠,當我們需求變得更多的時候。Java類的擴充套件是一個非常好的解決問題方法。
或者說Java類的繼承 *
package dome;
public class CD extends Item {
//extends擴充套件,CD就是Item的一個子類,通過派生,繼承
//CD中的屬性動作
// private String title;
private String artist;
private int numbofTracks;
// private int playingTime;
// private boolean gotIt = false;
// private String comment;
//屬性構造
public CD(String title, String artist, int numbofTracks, int playingTime, String comment) {
super(title,playingTime,false,comment); //構造
// this.title = title; //this一般指的是類CD
this.artist = artist;
this.numbofTracks = numbofTracks;
// this.playingTime = playingTime;
// this.comment = comment;
}
程式碼中能看到類CD擴充套件類Item,也可以說子類CD繼承父類Item
但是也要注意:
- 子類和父類的關係,屬性訪問並不繼承;
- 當我們去構造一個子類的物件的時候,他首先要確保它的父類所擁有的那些成員變數得到恰當的初始化;
- 所謂父類中的初始化:1定義初始化,2構造器,若這兩個模組同時存在,先做定義初始化;
- 如果父類和子類都有定義初始化和構造器,先開始執行父類中的程式,在做子類中的程式;
父類Item
物件變數和屬性
package dome;
public class Item {
//定義 子類中的公共屬性
private String title;
private int playingTime;
private boolean gotIt = false;
private String comment;
//構造初始化這些屬性
public Item(String title, int playingTime, boolean gotIt, String comment) {
super();
this.title = title;
this.playingTime = playingTime;
this.gotIt = gotIt;
this.comment = comment;
}
父類和子類的關係:
- 類定義了型別,子類定義了子型別
- 子類的物件可以被當作父類的物件來使用:1賦值給父類的變數2傳遞給需要父類物件的函式3放進存放父類物件的容器;
- 子類的物件可以傳遞給需要父類的物件的函式,子類物件可以賦值給父類的變數,變數只是物件的一個管理者;
容器的定義
需要一個類對容器的定義,方便父類中的變數執行後續操作對子類中的物件和屬性。
子類的物件可以放在存放父類物件的容器中;
package dome;
import java.util.ArrayList;
public class Database {
// private ArrayList<CD>listCD = new ArrayList<CD>(); //容器CD唱片
private ArrayList<Item>listItem = new ArrayList<>(); //做一個新類Item
// public void add(CD cd) //新增資料
// {
// listCD.add(cd);
// }
public void add(Item item) //item多型變數,Item是item的宣告型別,一般是靜態的
{
listItem.add(item);
}
public void list() //表單中的所有資料
{
// for(CD cd:listCD)
// {
// cd.print();
// }
for(Item item : listItem) //for each迴圈,變數item只是一個管理者
{
item.print(); //輸出各個子類中的物件
System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Item item = new Item();
CD cd = new CD("b","h",5, 60,"sdfsefg");
item = (Item)cd; //造型
//CD cc =(CD)item; //強制,但不是型別轉換
Database db = new Database();
- Java的物件變數是多型的,他們能儲存不止一種型別;
- 他們可以儲存的是宣告型別的物件,或宣告型別的子類的物件;
- 把子類的物件賦給父類的變數的時候,就發生了向上的造型;
向上造型
造型cast:子類物件可以賦值給父類的變數,但注意!Java中不存在物件對物件的賦值!,父類的物件不能賦值給子類的變數!
Vechicle v; 父類
Car c = new Car; 子類
v = c ;可以
c = v ;錯誤,只能向上造型
可以用造型: c = (Car)v;(只有當v這個變數實際管理的是Car才行)
向上造型,拿一個子類的物件,當作父類的物件來用
向上造型是預設的,不需要運算子,向上造型總是安全的
Java類的繼承總結
- 繼承是面向物件最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充套件新的能力。
- Java繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。
- 這種技術使得複用以前的程式碼非常容易,能夠大大縮短開發週期,降低開發費用。比如可以先定義一個類叫車,車有以下屬性:車體大小,顏色,方向盤,輪胎,而又由車這個類派生出轎車和卡車兩個類,為轎車新增一個小後備箱,而為卡車新增一個大貨箱。
繼承就是子類繼承父類的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
Java繼承是面向物件的最顯著的一個特徵。繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充套件新的能力。
類和類之間的繼承關係可以用UML符號表示,其中父類又叫超類或基類,子類又叫派生類。父類是子類的一般化,子類是父類的特化(具體化)。
JAVA不支援多繼承,單繼承使JAVA的繼承關係很簡單,一個類只能有一個父類,易於管理程式,同時一個類可以實現多個介面,從而克服單繼承的缺點。
構造器
子類是不繼承父類的構造器(構造方法或者建構函式)的,它只是呼叫(隱式或顯式)。
如果父類的構造器帶有引數,則必須在子類的構造器中顯式地通過super關鍵字呼叫父類的構造器並配以適當的引數列表。
如果父類構造器沒有引數,則在子類的構造器中不需要使用super關鍵字呼叫父類構造器,系統會自動呼叫父類的無參構造器。