day16_物件導向(訪問控制許可權丶內部類丶引用型別使用總結)

java_pedestrian發表於2020-12-23

訪問控制許可權

Java許可權修飾符public、protected、 (預設)、 private置於類的成員定義前,用來限定物件對該類成員的訪問許可權。

總結

  • private 表示私有的,只能在本類中訪問
  • public 表示公開的,在任何位置都可以訪問
  • “預設”表示只能在本類,以及同包下訪問。
  • protected表示只能在本類、同包、子類中訪問。

訪問控制修飾符可以修飾什麼

  • 屬性(4個都能用)
  • 方法(4個都能用)
  • 類(public和預設能用,其它不行。)
  • 介面(public和預設能用,其它不行。)

內部類

當一個事物的內部,還有一個部分需要一個完整的結構進行描述,而這個內部的完整的結構又只為外部事物提供服務,那麼整個內部的完整結構最好使用內部類。在Java中,允許一個類的定義位於另一個類的內部,前者稱為內部類,後者稱為外部類。內部類主要分類:

  

成員內部類作為類的成員的角色:

  • 和外部類不同,Inner class還可以宣告為private或protected;
  • 可以呼叫外部類的結構
  • Inner class 可以宣告為static的,但此時就不能再使用外層類的非static的成員變數;

成員內部類作為類的角色:

  • 可以在內部定義屬性、方法、構造器等結構
  • 可以宣告為abstract類 ,因此可以被其它的內部類繼承
  • 可以宣告為final的
  • 編譯以後生成OuterClass$InnerClass.class位元組碼檔案(也適用於區域性內部類)

注意

  • 非static的成員內部類中的成員不能宣告為static的,只有在外部類或static的成員內部類中才可宣告static成員。
  • 外部類訪問成員內部類的成員,需要“內部類.成員”或“內部類物件.成員”的方式
  • 成員內部類可以直接使用外部類的所有成員,包括私有的資料
  • 當想要在外部類的靜態成員部分使用內部類時,可以考慮內部類宣告為靜態的

訪問特點

  • 內部類可以直接訪問外部類的成員,包括私有成員。
  • 外部類要訪問內部類的成員,必須要建立內部類的物件。

建立內部類物件格式:

  • 外部類名.內部類名 物件名 = new 外部型別().new 內部型別();

程式碼示例

package demo05;

class Outer {
    private int s = 111;

    public class Inner {
        private int s = 222;

        public void mb() {
            int s = 333;
            System.out.println(s); // 區域性變數s
            System.out.println(this.s); // 內部類物件的屬性s
            System.out.println(Outer.this.s); // 外部類物件屬性s
        }
    }

    public void ma() {
        Inner i = new Inner();
        i.mb();
    }
}

public class InnerTest {
    public static void main(String args[]) {
        //外部類名.內部類名 物件名 = new 外部型別().new 內部型別();
        Outer.Inner inner = new Outer().new Inner();
        inner.mb();
    }
}

區域性內部類

如何宣告區域性內部類 

如何使用區域性內部類

  • 只能在宣告它的方法或程式碼塊中使用,而且是先宣告後使用。除此之外的任何地方都不能使用該類
  • 但是它的物件可以通過外部方法的返回值返回使用,返回值型別只能是區域性內部類的父類或父介面型別

區域性內部類的特點

  • 內部類仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符號,以及數字編號。
  • 只能在宣告它的方法或程式碼塊中使用,而且是先宣告後使用。除此之外的任何地方都不能使用該類。
  • 區域性內部類可以使用外部類的成員,包括私有的。
  • 區域性內部類可以使用外部方法的區域性變數,但是必須是final的。由區域性內部類和區域性變數的宣告週期不同所致。
  • 區域性內部類和區域性變數地位類似,不能使用public,protected,預設,private
  • 區域性內部類不能使用static修飾,因此也不能包含靜態成員

匿名內部類

匿名內部類是區域性內部類的一種。因為這個類沒有名字而得名,叫做匿名內部類。匿名內部類不能定義任何靜態成員、方法和類,只能建立匿名內部類的一個例項。一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。

格式: 

 匿名內部類的特點

  • 匿名內部類必須繼承父類或實現介面
  • 匿名內部類只能有一個物件
  • 匿名內部類物件只能使用多型形式引用

以介面為例,匿名內部類的使用,程式碼如下: 

定義介面

public interface Compute {
    int sum(int a, int b );

}

定義類使用介面

class MyMath{
    public int sum(Compute compute, int a ,int b){
        return  compute.sum(a, b);
    }
    
}

定義測試類通常在方法的形式引數是介面或者抽象類時,也可以將匿名內部類作為引數傳遞。程式碼如下: 

class  Test{
    public static void main(String[] args) {
        int sum = new MyMath().sum(new Compute() {
            @Override
            public int sum(int a, int b) {
                return a + b;

            }

            ;
        }, 3, 5);
        System.out.println(sum);
    }

}

引用型別使用總結

實際的開發中,引用型別的使用非常重要,也是非常普遍的。我們可以在理解基本型別的使用方式基礎上,進一步去掌握引用型別的使用方式。基本型別可以作為成員變數、作為方法的引數、作為方法的返回值,那麼當然引用型別也是可以的。 

  • 類作為成員變數時,對它進行賦值的操作,實際上,是賦給它該類的一個物件。
  • 類作為方法引數:在編寫程式中,會經常碰到呼叫的方法要接收的是一個類型別的情況,那麼這時,要向方法中傳入該類的物件
  • 類作為方法返回值:寫程式呼叫方法時,我們以後會經常碰到返回一個類型別的返回值,那麼這時,該方法要返回一個該類的物件。
  • 抽象類作為成員變數時,對它進行賦值的操作,實際上,是賦給它該抽象類的一個子類物件
  • 抽象類作為方法引數:開發中,抽象類作為方法引數的情況也很多見。當遇到方法引數為抽象類型別時,要傳入一個實現抽象類所有抽象方法的子類物件。
  • 抽象類作為方法返回值:抽象類作為方法返回值的情況,也是有的,這時需要返回一個實現抽象類所有抽象方法的子類物件。
  • 介面作為成員變數時,對它進行賦值的操作,實際上,是賦給它該介面的一個子類物件。
  • 介面作為引數時,傳遞它的子類物件。
  • 介面作為返回值型別時,返回它的子類物件。

相關文章