Java內部類

你之因此能優於別人,正是由於你堅持了別人所不能堅持的。
本文相關代碼在個人Github,歡迎Star~
https://github.com/zhangzhibo1014/DaBoJava

內部類

將一個類的定義放在另外一個類的定義內部,這就是內部類。而包含內部類的類被稱爲外部類git

內部類分類

  • 成員內部類
  • 局部內部類
  • 匿名內部類
  • 靜態內部類

成員內部類

成員內部類是最普通的一種內部類,成員內部類能夠訪問外部類全部的屬性和方法。可是外部類要訪問成員內部類的屬性和方法,必需要先實例化成員內部類。github

public class Demo {

    private String name = "Tom";

    // 定義一個成員內部類,做爲成員變量
    class Student{
        private int age = 20;
        private String name = "Jack";

        public void show() {
            System.out.println("內部類屬性;" + name);
            System.out.println("內部類屬性:" + age);
            System.out.println("外部類屬性:" + Demo.this.name);
        }
    }

    public static void main(String[] args) {
        //聲明一個外部類對象
        Demo demo = new Demo();
        //聲明一個內部類對象
        Student student = demo.new Student();
        student.show();
    }
}

成員內部類的使用方法

  • 內部類至關於外部類的一個成員變量,因此內部類可使用任意修飾符
  • 內部類在外部類裏面,因此內部類裏能夠直接訪問外部類的方法和屬性,反之不行
  • 定義成員內部類後,必須使用外部類對象來建立內部類對象,即 內部類 對象名 = 外部類對象.new 內部類();
  • 若是外部類和內部類具備相同的成員變量或方法,內部類默認訪問本身的成員變量或方法,若是要訪問外部類的成員變量,可使用 this 關鍵字。

注:成員內部類不能含有 static 的變量和方法,由於成員內部類須要先建立了外部類,才能建立它本身的微信

靜態內部類

靜態內部類一般被稱爲嵌套類。app

靜態內部類是不須要依賴於外部類的,這點和類的靜態成員屬性有點相似,而且它不能使用外部類的非static成員變量或者方法,這點很好理解,由於在沒有外部類的對象的狀況下,能夠建立靜態內部類的對象,若是容許訪問外部類的非static成員就會產生矛盾,由於外部類的非static成員必須依附於具體的對象函數

public class Demo1 {
    private String name = "static";

    private static int id = 2019;

    static class Student{
        int id = 11;

        public void show() {
            System.out.println("外部類成員變量:" + (new Demo1().name));
            System.out.println("外部類靜態成員:" + Demo1.id);
            System.out.println("內部類成員變量:" + id);
        }

    }

    public static void main(String[] args) {
        Student student = new Student();
        student.show();
    }
}

靜態內部類特色

  • 靜態內部類不能直接訪問外部類的非靜態成員,但能夠經過 new 外部類().成員 的方式訪問
  • 若是外部類的靜態成員與內部類的成員名稱相同,可經過 類名.靜態成員 訪問外部類的靜態成員;若是外部類的靜態成員與內部類的成員名稱不相同,則可經過 成員名 直接調用外部類的靜態成員
  • 建立靜態內部類的對象時,不須要外部類的對象,能夠直接建立 內部類 對象名 = new 內部類();

局部內部類

局部內部類,是指內部類定義在方法和做用域內ui

局部內部類也像別的類同樣進行編譯,但只是做用域不一樣而已,只在該方法或條件的做用域內才能使用,退出這些做用域後沒法引用的。this

/**
 * 局部內部類
 */
public class Demo2 {

    //將內部類定義在方法中
    public void show() {
        final String name = "Tom";
        class Student{
            int id = 20;
            public void show() {
                System.out.println("外部類方法變量:" + name);
                System.out.println("內部類屬性變量:" + id);
            }
        }
        Student student = new Student();
        student.show();
    }

    //將內部類定義在做用域內
    public void display(int num) {
        if(num > 2) {
            class Person{
                int age = 18;

                public void show() {
                    System.out.println("age = " + age);
                }
            }
            Person person = new Person();
            person.show();
        } else {
            System.out.println("None");
        }
    }

    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        demo2.show();
        demo2.display(3);
    }
}

局部內部類特色

  • 局部內部類就像是方法裏面的一個局部變量同樣,是不能有 publicprotectedprivate 以及 static 修飾符的。
  • 局部內部類能夠被 final 修飾。

匿名內部類

匿名內部類,顧名思義,就是沒有名字的內部類。正由於沒有名字,因此匿名內部類只能使用一次,它一般用來簡化代碼編寫。但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口設計

/**
 * 匿名內部類
 */
public class Demo3 {

    public static void main(String[] args) {
        Demo3 demo3 = new Demo3();
        // 匿名內部類 -> 類繼承
        new Animal() {
          public void say() {
              System.out.println("Say");
          }
        }.say();
        // 匿名內部類 -> 接口實現
        new Fruit(){
            public void eat() {
                System.out.println("apple");
            }
        }.eat();
    }

}

class Animal{
    public void say() {
        System.out.println("Animal say");
    }
}

interface Fruit{
    void eat();
}

匿名內部類特色

  • 匿名內部類是 不能加訪問修飾符 的。要注意的是, new 匿名類,這個類是要先定義的, 若是不先定義,編譯時會報錯該類找不到。
  • 匿名內部類沒有構造函數。

內部類的主要做用

  • 內部類提供了更好的封裝,能夠把內部類隱藏在外部類以內,不容許同一個包中的其餘類訪問該類
  • 內部類的方法能夠直接訪問外部類的全部數據,包括私有的數據
  • 內部類所實現的功能使用外部類一樣能夠實現,只是有時使用內部類更方便
  • 內部類容許繼承多個非接口類型

總結

咱們能夠根據具體需求來設計和使用內部類。code

相關代碼記錄於GitHub中,歡迎各位夥伴 Star對象

有任何疑問 微信搜一搜 [程序猿大博] 與我聯繫~

若是以爲對您有所幫助,請 點贊收藏 ,若有不足,請評論或私信指正!謝謝~

相關文章
相關標籤/搜索