Java面向對象之內部類詳解

前言

在 Java 中,允許一個類的定義位於另一個類的內部,前者稱為內部類,後者稱為外部類。本篇博客將總結內部類的使用。

內部類概述

當一個事物的內部,還有一個部分需要一個完整的結構進行描述,而這個內部的完整的結構又隻為外部事物提供服務,那麼整個內部的完整結構最好使用內部類。

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

內部類一般用在定義它的類或語句塊之內,在外部引用它時必須給出完整的名稱。

內部類的名字不能與包含它的外部類類名相同;

內部類的分類

內部類分為:

成員內部類( static 成員內部類和非 static 成員內部類)

局部內部類(方法內,代碼塊內,構造器內)

成員內部類

一方面,作為外部類的成員:

  • 調用外部類的結構。
  • 可以被 static 修飾(註意裡面隻能調用靜態方法,靜態屬性)。
  • 可以被4種不同的權限修飾。

另一方面,作為一個類:

  • 類內可以定義屬性、方法、構造器等。
  • 可以被final修飾,表示此類不能被繼承。
  • 可以被 abstract 修飾。
class People{
    String race;
    String countries;

    //靜態成員內部類
    static class Man{
        String name;
        public Man(){
        }
        public void display(){
            System.out.println("3090yyds");
        }

    }

    // 非靜態成員內部類
    class Women{
        String name;
        public Women(){
        }
        public void display(){
            System.out.println("化妝");
        }
    }
}

如何實例化成員內部類的對象

package 內部類;

​​​​​​​public class Demo {
    public static void main(String[] args) {
        //創建Man對象(靜態的成員內部類)
        People.Man m = new People.Man();
        m.display();
        //創建Women對象(非靜態的成員內部類)
        People p = new People();
        People.Women w = p.new Women();
        w.display();
    }
}

如何在成員內部類成員中區分調用外部類的對象

package 內部類;

public class Demo {
    public static void main(String[] args) {
        //創建Women對象(非靜態的成員內部類)
        People p = new People();
        People.Women w = p.new Women();
        w.display("a");
    }
}

class People{
    String name = "niu";
    String countries;
    public void eat(){
        System.out.println("吃飯");
    }
    // 非靜態成員內部類
    class Women{
        String name = "aniu";
        public Women(){
        }
        public void eat(){
            System.out.println("吃蔬菜");
        }
        public void display(String name){
            System.out.println("化妝");
            System.out.println(name); //方法的形參
            System.out.println(this.name); //內部類的屬性
            System.out.println(People.this.name); //外部類的屬性
            this.eat(); //內部類的方法
            People.this.eat(); // 外部類的方法
        }
    }
}

局部內部類

局部內部類可以在方法內,代碼塊內,構造器內

class Animal{ 
// 局部內部類
    // 構造器內
    Animal(){
        class Dog{
            
        }
    }
    
    // 代碼塊內
    {
        class Cat{
            
        }
    }
    
    // 方法內
    public void method(){
        class Bird{
            
        }
    }
}

開發中局部內部類的使用

我們在開發中局部內部類使用較多,比如,我們需要一個方法返回實現瞭某個接口的類的對象,此時方法內自然就需要一個內部類實現接口!

例:

 // 返回一個實現瞭Comparable接口的類的對象
    public Comparable getComparable(){
        // 創建一個實現瞭Comparable接口的類 ---局部內部類
        class MyComparable implements Comparable{
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }
        return new MyComparable();   // 非匿名內部類的匿名對象
    }

或者是這樣

 // 返回一個實現瞭Comparable接口的類的對象
    public Comparable getComparable(){     
        return new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };  // 匿名內部類的匿名對象

到此這篇關於Java面向對象之內部類詳解的文章就介紹到這瞭,更多相關Java內部類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: