工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java のネストされた内部クラス

Java のネストされた内部クラス

このチュートリアルでは、Java のネストされたクラスとその型について、例を使って学習します。

Java では、別のクラス内にクラスを定義できます。そのようなクラスは nested class として知られています .たとえば、

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

Java で作成できるネストされたクラスには 2 つのタイプがあります。

推奨読書 :

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


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

非静的ネスト クラスは、別のクラス内のクラスです。外側のクラス (外部クラス) のメンバーにアクセスできます。一般に inner class として知られています .

inner class以来 外部クラス内に存在する場合、内部クラスをインスタンス化するために、最初に外部クラスをインスタンス化する必要があります。

Java で内部クラスを宣言する方法の例を次に示します。

例 1:内部クラス

class CPU {
    double price;
    // nested class
    class Processor{

        // members of nested class
        double cores;
        String manufacturer;

        double getCache(){
            return 4.3;
        }
    }

    // nested protected class
    protected class RAM{

        // members of protected nested class
        double memory;
        String manufacturer;

        double getClockSpeed(){
            return 5.5;
        }
    }
}

public class Main {
    public static void main(String[] args) {

        // create object of Outer class CPU
        CPU cpu = new CPU();

       // create an object of inner class Processor using outer class
        CPU.Processor processor = cpu.new Processor();

        // create an object of inner class RAM using outer class CPU
        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

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

Main クラス内では、

注意 :ドットを使用します (. ) 演算子を使用して、外部クラスを使用して内部クラスのインスタンスを作成します。


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

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

例 2:メンバーへのアクセス

class Car {
    String carName;
    String carType;

    // assign values using constructor
    public Car(String name, String type) {
        this.carName = name;
        this.carType = type;
    }

    // private method
    private String getCarName() {
        return this.carName;
    }

// inner class
    class Engine {
        String engineType;
        void setEngine() {

           // Accessing the carType property of Car
            if(Car.this.carType.equals("4WD")){

                // Invoking method getCarName() of Car
                if(Car.this.getCarName().equals("Crysler")) {
                    this.engineType = "Smaller";
                } else {
                    this.engineType = "Bigger";
                }

            }else{
                this.engineType = "Bigger";
            }
        }
        String getEngineType(){
            return this.engineType;
        }
    }
}

public class Main {
    public static void main(String[] args) {

// create an object of the outer class Car
        Car car1 = new Car("Mazda", "8WD");

        // create an object of inner class using the outer class
        Car.Engine engine = car1.new Engine();
        engine.setEngine();
        System.out.println("Engine Type for 8WD= " + engine.getEngineType());

        Car car2 = new Car("Crysler", "4WD");
        Car.Engine c2engine = car2.new Engine();
        c2engine.setEngine();
        System.out.println("Engine Type for 4WD = " + c2engine.getEngineType());
    }
}

出力 :

Engine Type for 8WD= Bigger
Engine Type for 4WD = Smaller

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

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

this を使用しています carType にアクセスするためのキーワード 外部クラスの変数。 this.carType を使用する代わりに、 Car.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 nested class
   static class USB{
       int usb2 = 2;
       int usb3 = 1;
       int getTotalPorts(){
           return usb2 + usb3;
       }
   }

}
public class Main {
   public static void main(String[] args) {

       // create an object of the static nested class
       // using the name of the outer class
       MotherBoard.USB usb = new MotherBoard.USB();
       System.out.println("Total Ports = " + usb.getTotalPorts());
   }
}

出力 :

Total Ports = 3

上記のプログラムでは、USB という名前の静的クラスを作成しました。 MotherBoard クラス内 .行に注意してください、

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

ここでは、USB のオブジェクトを作成しています。 外部クラスの名前を使用します。

では、外側のクラスのメンバーにアクセスしようとするとどうなるか見てみましょう:


例 4:静的内部クラス内の外部クラスのメンバーへのアクセス

class MotherBoard {
   String model;
   public MotherBoard(String model) {
       this.model = model;
   }

   // static nested class
   static class USB{
       int usb2 = 2;
       int usb3 = 1;
       int getTotalPorts(){
           // accessing the variable model of the outer classs
           if(MotherBoard.this.model.equals("MSI")) {
               return 4;
           }
           else {
               return usb2 + usb3;
           }
       }
   }
}
public class Main {
   public static void main(String[] args) {

       // create an object of the static nested class
       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 に保存 .


覚えておくべき重要なポイント


Java

  1. C# ネストされたクラス
  2. Java 変数とリテラル
  3. Java クラスとオブジェクト
  4. Java 最終キーワード
  5. オペレーターの Java インスタンス
  6. Java 抽象クラスと抽象メソッド
  7. Java ネストされた静的クラス
  8. Java匿名クラス
  9. Java シングルトン クラス
  10. Java リフレクション
  11. Javaジェネリック