java-day18
目錄
數據隱藏
在定義一個類的時候,我們需要考慮以下,類中的哪些屬性/方法對外是可見的,哪些屬性/方法對外是不可見的。
例如類中有些屬性是內部使用,用來表示對象內部的一些狀態,在這種情況下,其他代碼中是沒有必要知道我們對象裏面這個屬性的存在。這時候就可以使用private修飾符,把這些屬性/方法隱藏起來。
注意,在使用private隱藏屬性的時候,我們還可以現在當前是否允許用戶設置或者訪問這個屬性,如果允許用戶設置,那麼就可以提供一個set方法,如果允許用戶訪問,那麼就提供一個get方法,這時候,用戶雖然不能直接訪問這個屬性,但是可以通過get/set方法間接的來訪問這個屬性,這樣做的目的可以提供我們對這個屬性的控制力,以及提高屬性的安全。
public class Student{
public String name;
private int age;
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
main:
Student s = new Student();
s.name = "tom";
System.out.println(s.name);
//s.age = 20;
//System.out.println(s.age);
s.setAge(20);
System.out.println(s.getAge());
注意,類中attribute和property的區別,一提到attribute,我們第一個想到的就應該是類中的屬性,一提到property,我們第一個想到的就應該是類中get/set方法。
注意,property的規則就是,去掉get/set方法前面的get/set這個單詞,然後剩下的單詞,首字母小寫,最後的結果就是property。所以get/set這個方法並不是property。
注意,property只是給get/set方法的特殊形式起了一個名字而已。這個特殊形式就是去掉get/set單詞,剩下部分首字母大寫。
注意,property指的都是這種特殊的方法,get/set方法,專門用來取值和設置值的方法。
封裝
隱藏代碼的實現細節
對於調用者來講,很多時候,這個代碼實現的細節,我們是沒有必要、也不需要知道,我們只要知道這個方法叫什麼名字,怎麼去調用,調用的時候需要傳什麼參數,返回的結果是什麼樣子,以及調用的過程中可能會拋出什麼異常,每種異常代表了什麼情況等信息就可以了。也有一些情況,是方法/接口的提供提供者也不願意讓我們知道它們的實現細節,例如這些都是有商業用途的或者軟件不開源的等情況。
統一用戶的調用接口
假如有三個用戶:user、vip、admin
查看當前的頁面信息:
三個用戶查看的到的內容是不同的,所以需要三個不同的方法針對這個三種用戶,返回不同的信息
user showInfo_user( ) vip showInfo_ vip( ) admin showInfo_ admin( )
可以進行封裝:
public String showInfo_a11(){
//根據當前調用者角色身份,來確定主要執行的代碼
if(role == 0){
//...........
}
else if(role == 1){
//...........
}
else if(role == 2){
//...........
}
return ... ;
}
提高系統的可維護性
從封裝後的結果來看,對於調用者,需要調用的接口變少了,調用的方式也變簡單了,提高了開發的效率,同時對於這些接口的提供者,我們維護接口的數量變少了,以前在很多地方編寫的相同的代碼,都封裝起來,在其他地方進行調用,這樣也減少了很多的維護工作量。
方法重載
重載和重寫是java中和方法相關的兩個非常重要的現象。
在一個類中,有多個方法的名字相同,但是方法的參數列表不同,這個情況就叫方法的重載。
例如,System. out. print1n中的println方法
總結:編譯器在類中確認一個方法,只會通過方法名和參數列表,所以不同的倆個方法有三種情況:
1.方法名和參數類別都不同
2.方法名不同,參數列表相同
3.方法名相同,參數列表不同
如果一個類中出現了上面描述的第三種情況,那麼就是方法的重載。
方法的參數列表不同,分爲幾種情況:
1.參數的個數不同
public void test(){}
public void test(int a){}
public void test(String s1,String s2){}
2.參數的類型不同
public void test(int a){}
public void test(String s){}
public void test(Student stu){}
3.參數的順序不同
public void test(int a,String s){}
public void test(String s,int a){}
方法重載的要求:
1.在同一個類中
2.方法名相同
3.方法參數列表不同
4.修飾符、返回類型、拋出異常這些地方沒有限制
重載的作用/意義
例如,我們一直使用的println方法 可以幫調用者輸出數據,但是數據的類型有很多中,不同類型數據的處理方式還存在着差異,所以並不能使用相同的代碼把所有類型的數據都處理掉,所以我們就需要分別處理了。然後就對println方法進行了重載,每種重載後的方法都是專門對其中一種數據類型進行處理的。
對於調用者來說,我們只需調用這個println,然後把我們手上的數據傳給他,之後就是編譯器或者JVM,根據這個方法的名字,以及我們所傳的參數類型,自動的去查找定位這個要的調用的方法是重載的哪一個,找到之後就可以執行了。因爲重載方法中包含我們所有的數據類型,所以調用者並不需要知道我們確定調用的是哪一個方法,我們只是把數據傳給這個方法。
總結:一個方法,只能處理一種數據類型,但是java中有很多種數據類型,如果我們想讓這個方法去處理不同的數據類型,那麼方法的重載就是一個不錯的選擇。
實例:
public class OverLoadTest{
public static void main(String[] args){
OverLoadTest t = new OverLoadTest();
t.test(1,1);
}
public void test(int a,long b){
System.out.println("第一個方法被調用");
}
public void test(long a,int b){
System.out.println("第二個方法被調用");
}
public void test(){
}
public void test(int a){
}
public void test(String s){
}
public void test(int a,String s){
}
public void test(String s,int a){
}
private static int test()throws RuntimeException{
return 0;
}
}