29.面向對象-----類的成員以內部類

  在Java中,容許一個類的定義位於另外一個類的內部,前者稱爲內部類,後者稱爲外部類。

1.內部類的分類

成員內部類(靜態和非靜態)和局部內部類(方法內、代碼塊內、構造器內)

2.成員內部類的理解

一方面,做爲外部類的成員:this

   >調用外部類的結構
   >能夠被static修飾
   >能夠被4種不一樣的權限修飾spa

另外一方面,做爲一個類:3d

   > 類內能夠定義屬性、方法、構造器等
   > 能夠被final修飾,表示此類不能被繼承。言外之意,不使用final,就能夠被繼承
   > 能夠被abstract修飾code

特色:

  • 成員內部類能夠無條件的訪問外部類的全部的成員屬性和方法不受 private 和 static影響
  • 當內部類的成員屬性或者方法與外部類的同名時,會發生隱藏現象。直接在內部類中調用的是內部類的成員屬性和方法。須要用 「外部類」.this.成員變量/成員方法
  • 若是外部類須要訪問內部類,須要生成內部對象,才能訪問內部類對象。
  • 成員內部類是依附外部類存在的,若是須要訪問成員內部類,那麼必定須要先建立外部類。
  • 因爲成員內部類的覺得外部類的成員的方式存在,因此類修飾能夠用 private public protect 無權限的修飾符修飾來表示內部的訪問權限的問題。而外部內不能夠。對象

public class test {
    public static void main(String[] args) {
        //建立靜態的成員內部類的對象
        Person.Inner2 inner2 = new Person.Inner2();

        //建立非靜態的成員內部類的對象
        Person p = new Person();
        Person.Inner1 inner1 = p.new Inner1();
        inner1.show();//name = 小張, age = 23
        inner2.show();//靜態成員內部類
    }
}

class Person{
    String name;
    int age;

    //非靜態成員內部類
    class Inner1{
        public void show(){
            name = "小張";
            age = 23;
            System.out.println("name = " + name + ", age = "+ age);
        }
    }

    //靜態成員內部類
    static class Inner2{
        public void show(){
            System.out.println("靜態成員內部類");
        }
    }

    public void eat(){
        System.out.println("人吃飯");
    }
}

3.如何在成員內部類中調用外部類的結構?

class Person{
    String name = "小明";
public void eat(){
}
//非靜態成員內部類
    class Bird{
        String name = "杜鵑";
        public void display(String name){
            System.out.println(name);//方法的形參
            System.out.println(this.name);//內部類的屬性
            System.out.println(Person.this.name);//外部類的屬性
        //Person.this.eat();
        }
    }
}

4.局部內部類

特色:

  • 不能用訪問權限修飾符關鍵字
  • 做用區間只在申明的局部內

 

 5.匿名內部類

特色:

  • 匿名內部類不能使用 static 和權限修飾符
  • 匿名內部沒有構造器。經過new XXX 的生成一個對象引用。
  • 匿名內部類屬於局部內部類,全部局部內部類限制的條件在匿名內部中依然有效

 

 

 

 

做者:Java之美blog

日期:2020-03-30繼承

相關文章
相關標籤/搜索