首頁 > 軟體

Java物件導向之內部類詳解

2022-10-06 14:08:16

前言

在 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內部類內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com