English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java フローコントロール

Java 配列

Java 面向对象(I

Java 面向对象(II

Java 面向对象(III

Java 例外処理

Java List(リスト)

Java Queue(キュー)

Java Map集合

Java Set集合

Java入出力(I/O)

Java Reader/Writer

Javaの他のトピック

Java 嵌套と内部クラス

このチュートリアルでは、Javaのネストッドクラスとその種類を例を用いて学びます。

Javaで、他のクラスの中でクラスを定義できます。このようなクラスはnested class(ネストッドクラス)と呼ばれます。例えば、

class OuterClass {
    // ...
    class NestedClass {
        // ...
    }
}

Javaを使用して2種類のネストされたクラスを作成できます。

  • 非静的ネストされたクラス(内部クラス)

  • 静态嵌套类

関連読書:

まず、非静的ネストされたクラスを見てみましょう。

非静的ネストされたクラス(内部クラス)

非静的ネストされたクラスは別のクラス内に存在するクラスです。封裝されたクラス(外部クラス)のメンバーにアクセスする権利があります。通常、inner class(内部クラス)と呼ばれます。

内部クラスは外部クラス内に存在するため、まず外部クラスをインスタンス化する必要があります。内部クラスをインスタンス化するために。

これはJavaで内部クラスを宣言する方法の例です。

示例1:内部クラス

class CPU {
    double price;
    // ネストされたクラス
    class Processor{
        //ネストされたクラスのメンバー
        double cores;
        String manufacturer;
        double getCache(){
            return 4.3;
        }
    }
    //ネストされた保護されたクラス
    protected class RAM{
        //保護されたネストされたクラスのメンバー
        double memory;
        String manufacturer;
        double getClockSpeed(){
            return 5.5;
        }
    }
}
public class Main {
    public static void main(String[] args) {
        //外部クラスCPUのオブジェクトを作成
        CPU cpu = new CPU();
       //外部クラスを使用して内部クラスProcessorのオブジェクトを作成
        CPU.Processor processor = cpu.new Processor();
        //外部クラスCPUを使用して内部クラスRAMのオブジェクトを作成
        CPU.RAM ram = cpu.new RAM();
        System.out.println("Processor Cache = "); + processor.getCache());
        System.out.println("Ram Clock speed = "); + ram.getClockSpeed());
    }
}

输出:

Processor Cache = 4.3
Ram Clock speed = 5.5

上記のプログラムには、外部クラスCPU内にProcessorとRAMという2つのネストされたクラスがあります:。内部クラスを保護されたものに宣言することができます。したがって、RAMクラスを保護されたクラスとして宣言しています。

Mainクラス内で

  • まず、名前がcpuの外部クラスCPUのインスタンスを作成します。

  • その後、外部クラスのインスタンスを使用して内部クラスのオブジェクトを作成します: 

    CPU.Processor processor = cpu.new Processor();
    CPU.RAM ram = cpu.new RAM();

注意:外部クラスを使用して内部クラスのインスタンスを作成するために点(.)演算子を使用します。

内部クラス内で外部クラスのメンバーにアクセス

このthisキーワードを使用して外部クラスのメンバーにアクセスできます。このキーワードについて詳しく知りたい場合は、アクセスしてくださいJavaのthisキーワードclass Car { 

示例2String carName;

String carType;
    使用構造関数で値を設定します
    public Car(String name, String type) {
    //this.carName = name;
    this.carType = type;
        private 方法
        private String getCarName() {
    }
    // return this.carName;
    内部クラス
        class Engine {
    }
    //String engineType;
    void setEngine() {
        CarのcarType属性にアクセスします
        WD")){
           //CarのgetCarName()メソッドを呼び出します
            if(Car.this.carType.equals("4if(Car.this.getCarName().equals("Crysler")) {
                //this.engineType = "Smaller";
                }
                    else{
                }
                    this.engineType = "Bigger";
                }
            }
                this.engineType = "Bigger";
            }
        }
        String getEngineType(){
            return this.engineType;
        }
    }
}
public class Main {
    public static void main(String[] args) {
        //外部クラスCarのオブジェクトを作成します
        Car car1 = new Car("Mazda", "8WD");
        //外部クラスを使用して内部クラスのオブジェクトを作成します
        Car.Engine engine = car1.new Engine();
        engine.setEngine();
        System.out.println("8WDエンジンタイプ= " + engine.getEngineType());
        Car car2 = new Car("Crysler", "4WD");
        Car.Engine c2engine = car2.new Engine();
        c2engine.setEngine();
        System.out.println("4WDエンジンタイプ = " + c2engine.getEngineType());
    }
}

输出:

8WDエンジンタイプ= Bigger
4WDエンジンタイプ = Smaller

上記のプログラムでは、外部クラスCarにEngineという内部クラスがあります。ここで、この行に注意してください。

if(Car.this.carType.equals("4WD")) {...}

thisキーワードを使用してcarType外部クラスの変数にアクセスします。Car.this.carTypeを使用するのではなく、this.carTypeを使用することに気づくかもしれません。

これは、外部クラスの名前Carを言及していない場合、thisキーワードは内部クラスのメンバーを表すからです。

同样,我们也从内部类访问外部类的方法。

if (Car.this.getCarName().equals("Crysler") {...

需要注意的是,尽管getCarName()是一个private方法,但我们能够从内部类访问它。

静态嵌套类

在Java中,我们还可以在另一个类中定义一个静态(static)类。 这种类称为静态嵌套类(static nested class)。 静态嵌套类不称为静态内部类。

与内部类不同,静态嵌套类无法访问外部类的成员变量。这是因为静态嵌套类不需要您创建外部类的实例。

OuterClass.NestedClass obj = new OuterClass.NestedClass();

在这里,我们仅通过使用外部类的类名来创建静态嵌套类的对象。因此,不能使用OuterClass.this引用外部类。

示例3:静态内部类

class MotherBoard {
   //静态嵌套类
   static class USB{
       int usb2 = 2;
       int usb3 = 1;
       int getTotalPorts(){
           return usb2 + usb3;
       }
   }
}
public class Main {
   public static void main(String[] args) {
       //创建静态嵌套类的对象
       //使用外部类的名称
       MotherBoard.USB usb = new MotherBoard.USB();
       System.out.println("Total Ports = "); + usb.getTotalPorts());
   }
}

输出:

Total Ports = 3

在上面的程序中,我们在类MotherBoard中创建了一个名为USB的静态类。 注意这一行,

MotherBoard.USB usb = new MotherBoard.USB();

在这里,我们使用外部类的名称创建一个USB对象。

现在,让我们看看如果尝试访问外部类的成员会发生什么:

示例4:在静态内部类内部访问外部类的成员

class MotherBoard {
   String model;
   public MotherBoard(String model) {
       this.model = model;
   }
   //静态嵌套类
   static class USB{
       int usb2 = 2;
       int usb3 = 1;
       int getTotalPorts(){
           //访问外部类的变量model
           if(MotherBoard.this.model.equals("MSI")) {
               return 4;
           }
           else {
               return usb2 + usb3;
           }
       }
   }
}
public class Main {
   public static void main(String[] args) {
       //创建静态嵌套类的对象
       MotherBoard.USB usb = new MotherBoard.USB();
       System.out.println("Total Ports = "); + usb.getTotalPorts());
   }
}

このプログラムを実行しようとすると、エラーが発生します:

error: non-static variable this cannot be referenced from a static context

これは、外部クラスのオブジェクトを使用して内部クラスのオブジェクトを生成していないため、外部クラスMotherboardがMotherboard.thisに保存されている外部クラスMotherboardの参照がありません。

覚えておくべきポイント

  • Javaは内部クラスをクラスの通常のメンバーとして視覚化します。それらはクラス内で宣言されたメソッドや変数のように見えます。

  • 内部クラスは外部クラスのメンバーであるため、内部クラスに適用できるアクセス修飾子(例:プライベート、プロテクテッド)は、通常のクラスでは不可能です。

  • 内包クラスは封入された外部クラスのメンバーであるため、点(.)表現を使用して内包クラス及其メンバーにアクセスできます。

  • 内包クラスを使用することで、コードの可読性が向上し、より良い封入が提供されます。

  • 非静的内包クラス(内部クラス)は外部にアクセスできます。/封闭クラスの他のメンバーは、それがプライベートとして宣言されていてもそれらが含まれます。