想了半天,發現單獨的封裝和多態沒什麼好講的,我們就簡單說說Java裡面對應的語法吧。 相關內容如下: 一、訪問修飾符 二、getter/setter方法 三、構造方法 四、super和this 五、static關鍵字 六、final關鍵字 七、方法重寫 八、抽象類和介面 一、訪問修飾符 Java當中 ...
想了半天,發現單獨的封裝和多態沒什麼好講的,我們就簡單說說Java裡面對應的語法吧。
相關內容如下:
一、訪問修飾符
二、getter/setter方法
三、構造方法
四、super和this
五、static關鍵字
六、final關鍵字
七、方法重寫
八、抽象類和介面
一、訪問修飾符
Java當中有四種情況,按其訪問範圍的順序由小到大分別是:
priate(私有)---->default(預設)---->protected(受保護)---->public(公共)
訪問範圍可以看下圖:
二、getter/setter方法
這個屬於封裝,前面例子中的女神的年齡,一般年齡肯定不能小於0吧,如果小於0了就給個預設值18,所以我們通過使用get/set方法來封裝這個屬性,就可以對屬性的取值進行限定了。
1 2 3 4 5 6 7 8 9 10 11 12 |
private int age; //年齡,定義為私有
public int getAge() {
return age;
}
public void setAge( int age) {
if (age<= 0 ){
this .age = 18 ;
}
else {
this .age = age;
}
}
|
三、構造方法
構造方法一般用於在初始化對象時就給對象的屬性賦值,前面我們創建一個女神對象是這樣寫的代碼:
1 2 3 4 5 6 |
//創建三個女神類型的對象
Goddess lin = new Goddess(); //女神對象
lin.name = "林志玲" ;
lin.age = 43 ;
lin.stature = 1.73 ;
lin.faceValue = 99 ; //顏值
|
如果使用構造方法,需在要對應的內中寫一個沒有返回值類型的方法,並且方法名與類名相同,同時,為了保證還能創建空白對象,我們還要編寫一個無參的構造方法,代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Goddess extends Woman {
public int faceValue; //顏值
public int getFaceValue() {
return faceValue;
}
public void setFaceValue( int faceValue) {
this .faceValue = faceValue;
}
public Goddess() {} //為了保證以後還能初始化空白的對象,保留無參的構造方法
public Goddess(String name, int age, double stature, int faceValue){
this .setName(name);
this .setAge(age);
this .setStature(stature);
this .setFaceValue(faceValue);
}
}
|
創建對象的代碼就簡單很多了:
1 |
Goddess lin = new Goddess( "林志玲" , 43 , 1.73 , 99 ); //女神對象
|
四、super和this
觀察仔細的人應該發現,上面的代碼中出現了“this”關鍵字,這個表示“當前對象”,另外一個“super”表示父類對象。
上面的代碼可以做如下修改,如果父類也有構造方法,子類可以使用“super”來調用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//父類中的構造方法代碼
public class Woman(){
public Woman(String name, int age, double stature){
this .setName(name);
this .setAge(age);
this .setStature(stature);
}
}
//子類中的構造方法代碼
public class Goddess extends Woman {
public Goddess(String name, int age, double stature, int faceValue){
super (name, age, stature);
this .setFaceValue(faceValue);
}
}
|
註意:調用父類的構造方法super(),必須寫在第一行。
五、static關鍵字
被static修飾的東西,我們稱之為靜態的。比較常用的有靜態變數,靜態方法,靜態代碼塊。
5.1 靜態變數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//在女神類中添加一個靜態變數
public static int count = 0 ; //女神總數
//測試代碼
public static void main(String[] args) {
//創建三個女神類型的對象
Goddess lin = new Goddess( "林志玲" , 43 , 1.73 , 99 ); //女神對象
lin.count++;
Goddess wang = new Goddess(); //女神對象
wang.count++;
wang.setName( "王祖賢" );
Goddess li = new Goddess(); //女神對象
li.setName( "李冰冰" );
li.count++;
System.out.println(lin.count); //結果為3
}
|
最終的列印結果為3,也就是說count是整個女神群體所共用的一個屬性。改變了A的count屬性的值為250,那麼B和C的count屬性值也變成了250。
5.2靜態方法
靜態方法和靜態變數的用法類似,也是整個群體共用的方法,就定義成靜態的,靜態方法還有個好處,可以直接通過類名來訪問,而不用創建對象。
1 2 3 4 5 6 7 8 |
//女神類中添加靜態方法
public static void haha(){
System.out.println( "我是女神!" );
}
//測試代碼
public static void main(String[] args) {
Goddess.haha(); //通過類名調用方法
}
|
5.3靜態代碼塊
這個東西就比較好玩的,它只會在JVM載入類時執行一次。
1 2 3 |
static {
System.out.println( "我是靜態代碼塊!" );
}
|
Java代碼的執行順序:
靜態變數初始化→靜態代碼塊→初始化靜態方法→初始化實例變數→代碼塊→構造方法
六、final關鍵字
可以用來修飾屬性、方法和類。
放在屬性前,表示這個屬性是個常量,必須在定義的時候賦值,並且以後不能修改其值。
放在方法前,表示這個方法不能被子類重寫(下一點會講到方法重寫)。
放在類前,表示這個類不允許被繼承。
代碼我就不演示了,這個比較簡單,小伙們自行試試就OK了。
七、方法重寫
方法重寫的目標,子類要改寫父類某個方法的實現。說直白點就是老子是礦工,有挖礦的方法,用鐵鍬來挖礦,兒子是挖礦師,繼承了礦工的方法,只不過他是用挖掘機來挖礦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//礦工類(父類)
public class Miner {
public void mining(){
System.out.println( "用鐵鍬一鍬一鍬的挖礦!" );
}
}
//挖礦員(子類)
public class DigMember extends Miner {
//重寫了父類的挖礦方法
public void mining(){
System.out.println( "用挖掘機挖礦!" );
}
}
//測試代碼
public static void main(String[] args) {
Miner miner = new DigMember(); //創建礦工的子類對象挖礦員
miner.mining(); //調用挖礦方法
}
|
結果:
通過結果可以發現,雖然定義的是父類變數,但new的是子類對象,所以調用的是子類的方法。如果是new的父類對象,那麼調用結果就是父類的方法。
八、抽象類和介面
抽象類(abstract):就是個抽象的類......,它最大的特征就是不能直接實例化,必須先有個子類(非抽象類),然後可以new子類對象。把剛纔的礦工改成抽象類:
1 2 3 4 5 |
public abstract class Miner {
public void mining(){
System.out.println( "用鐵鍬一鍬一鍬的挖礦!" );
}
}
|
如果現在創建一個礦工對象,會報語法錯誤:
但創建子類(子類不能是抽象類)對象是可以的:
比如動物,請問,動物是什麼顏色?有幾條腿?怎麼移動的?有幾隻翅膀?
是不是都不知道!!!
不知道就對了,因為動物就是個抽象的概念,像什麼貓、狗、人、日本人等等都是動物的一個子類。你能在現實生活中找出一個原生態的動物,它既不是貓也不是狗更不是任何其他動物的子類嗎?
介面(interface):介面是什麼呢?拿出你的U盤看看,再插到電腦的USB介面試試,如果你的滑鼠是USB介面的,請看看滑鼠的介面和U盤的介面有沒有什麼不一樣?
介面一般只是定義一個標準,它沒有具體的功能(看看你的電腦上的USB介面,請告訴我它是乾什麼的?可以加熱食物麽?可以冷藏飲料麽?可以看電影麽?都不行!)。
但我們可以實現這個標準介面的工具,比如實現了該介面的U盤,就可以通過這個介面來保存數據,實現了該介面的鍵盤,就可以通過這個介面往電腦里輸入數據。
如果上面例子中的挖礦員會開車,而礦工不會,並且以後還會有另外一個單獨的司機類也可以開車,那麼,我們就可以把開車定義成一個介面。需要會開車的類,去實現這個介面就行了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//定義開車的介面
//開車介面
public interface IDrive {
//開車方法
void drive();
}
//挖礦員類實現開車介面
public class DigMember extends Miner implements IDrive {
public void mining(){
System.out.println( "用挖掘機挖礦!" );
}
public void drive() {
// TODO Auto-generated method stub
System.out.println( "我會開挖掘機!!!" );
}
}
|
最後:抽象類和介面有什麼區別呢?
抽象類側重於一個群體,而介面側重於功能。
大家實現下麵這個案例就知道區別了:
創建一個集合(或數組)保存所有參加動物賽跑比賽的選手(有兔子、烏龜、小雞、獅子),再創建一個集合(或數組)保存所有參加飛行比賽的選手(飛機,老鷹,超人,擎天柱)。註意這些選手都會飛,但不一定有同一個父類。
今天的內容就到這兒吧,都只講了些基礎語法,有很多使用上的細節,大家可以拿些項目中的例子,我們一起來分析哈!
“軟體思維”博客地址:51CTO,博客園,感興趣的小伙伴可以去看相關的其它博文。