Java のネストされた内部クラス
Java のネストされた内部クラス
このチュートリアルでは、Java のネストされたクラスとその型について、例を使って学習します。
Java では、別のクラス内にクラスを定義できます。そのようなクラスは nested class
として知られています .たとえば、
class OuterClass {
// ...
class NestedClass {
// ...
}
}
Java で作成できるネストされたクラスには 2 つのタイプがあります。
- 非静的ネスト クラス (内部クラス)
- 静的ネスト クラス
推奨読書 :
- Java アクセス修飾子
- Java 静的キーワード
まず、静的ではないネストされたクラスを見てみましょう。
非静的ネスト クラス (内部クラス)
非静的ネスト クラスは、別のクラス内のクラスです。外側のクラス (外部クラス) のメンバーにアクセスできます。一般に 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 つのクラスがあります:Processor とRAM 外部クラス内:CPU .内部クラスを保護されていると宣言できます。したがって、RAM クラスを保護されていると宣言しました。
Main クラス内では、
- 最初に外部クラス CPU のインスタンスを作成しました cpu という名前 .
- 外側のクラスのインスタンスを使用して、内側のクラスのオブジェクトを作成しました。
CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();
注意 :ドットを使用します (.
) 演算子を使用して、外部クラスを使用して内部クラスのインスタンスを作成します。
内部クラス内の外部クラスのメンバーへのアクセス
このキーワードを使用して、外部クラスのメンバーにアクセスできます。このキーワードについて知りたい場合は、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 は内部クラスをクラスの通常のメンバーとして扱います。これらは、クラス内で宣言されたメソッドや変数に似ています。
- 内部クラスは外部クラスのメンバーであるため、
private
のような任意のアクセス修飾子を適用できます 、protected
通常のクラスでは不可能な内部クラスに。 - ネストされたクラスはそれを囲む外部クラスのメンバーであるため、ドット (
.
) 表記法を使用して、ネストされたクラスとそのメンバーにアクセスします。 - ネストされたクラスを使用すると、コードが読みやすくなり、カプセル化が向上します。
- ネストされた非静的クラス (内部クラス) は、private と宣言されていても、外部/囲んでいるクラスの他のメンバーにアクセスできます。
Java