#java 一個簡單的例子理解java繼承、成員函式重寫、型別轉換
一個簡單的例子理解java繼承、成員函式重寫、型別轉換
1、繼承簡介
舉一個簡單的例子:筆分為很多種,比如毛筆、鋼筆、圓珠筆等等,這些筆都有一些相同的屬性比如長度、筆跡的粗細等等;但他們也有不同的特點,比如他們的用途(毛筆可以寫對聯、鋼筆可以寫作業等等)等。這時候要編寫一個程式用類表示這些筆,一般的方法就必須把各種筆的眾多相同的屬性重複寫很多次,就很浪費時間。這時候就可以藉助繼承,先寫一個擁有所有筆共同點的類,再分別寫每一種筆的類,讓其繼承這個共同類即可。
先寫一個筆的類:
public class pen { //定義長度 private int length; //定義品牌 private String brand; //定義筆跡的粗細 private int width; public void setLength(int l){ length = l; } public int getLength(){ return length; } public void setBrand(String b){ brand = b; } public String getBrand(){ return brand; } public void setWidth(int w){ width = w; } public int getWidth(){ return width; } public void write(){ System.out.println("寫了一個字"); } }
這時候寫毛筆的類的時候,對於筆的共同屬性就只需要先用extends關鍵字繼承,再寫其特有的屬性和方法即可。(繼承的格式class 子類/派生類 extends 父類/基類/超類 ,基類/父類/超類 就是擁有共同屬性和方法的類, 子類/派生類則是從父類繼承過來,擁有它自己特有的屬性和方法的類。)
public class inkBrush extends pen{
public void writeCouplet(){
System.out.println("寫了一副對聯");
}
}
同樣,鋼筆類也只需先繼承再寫鋼筆獨有的屬性和方法。
public class pencil extends pen{ public void doHomework(){ System.out.println("完成了一次作業。"); } }
2、關於類類裡面可以被繼承的部分
Java裡面的子類可以繼承父類的所有屬性和方法,只不過不能直接訪問私有成員,預設的成員不能跨包繼承。
3、關於方法的重寫
不同的筆都可以寫字,但不同的筆寫出的子是不一樣的。這時候就需要在各種筆的子類裡重寫write方法,如下所示:
public class pencil extends pen{
public void write(){
System.out.println("用鋼筆寫了一個字");
}
}
子類裡重寫的方法必須和父類裡的方法的關鍵字、方法名、方法裡的引數個數以及每一個引數的屬性都必須相同。不然就成了方法的過載。
3、關於類的型別轉換
每種筆都可以用來寫字。當一個學生用鋼筆寫字的時候,我們可以說“他在用鋼筆寫字”,也可以說“他在用筆寫字“。用類表示如下:
寫一個學生類:
public class student {
public void write(pen p){
p.write();
}
}
主函式裡面:
public class Manage {
public static void main(String [] args){
student stu1 = new student();
pencil p1 = new pencil();
stu1.write(p1);
}
}
學生類的doHomework方法裡的引數是pen的型別,主函式裡student物件stu1的doHomework方法裡的引數是pencil,但並沒有報錯。這說明pencil自動轉換為了pen物件。
自動型別轉換隻能從子類轉換為父類,不能從父類轉換為子類,從父類轉換為子類必須使用強制型別抓換。
一個學生在寫作業的時候,我們可以說“他用鋼筆寫作業”,也可以不用說明他用什麼筆寫作業,直接說“他用筆寫作業”。用類表示如下:
寫一個學生類:
public class student {
public void doHomework(pen p){
p.doHomework();
}
}
如果按照上述寫法會報錯,這是因為pen這個類沒有doHomework的方法,doHomework時pen的派生類pencil裡的方法。著也說明pen類的物件無法轉換成pencil類物件。這時候可以採用強制型別轉換(強制型別轉換的格式: 轉換前的類名 轉換前的物件名 = (轉換後的類名)需轉換的物件名)。如下所示:
public class student {
public void doHomework(pencil p){
p.doHomework();
}
}