2020/3/13學習筆記-day18

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;
    }
​
​
}
​

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章