Вложенный и внутренний класс Java
Вложенный и внутренний класс Java
В этом руководстве вы узнаете о вложенном классе в Java и его типах с помощью примеров.
В Java вы можете определить класс внутри другого класса. Такой класс известен как nested class
. Например,
class OuterClass {
// ...
class NestedClass {
// ...
}
}
В Java можно создать два типа вложенных классов.
- Нестатический вложенный класс (внутренний класс)
- Статический вложенный класс
Рекомендуется к прочтению :
- Модификаторы доступа к 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
В приведенной выше программе есть два вложенных класса:Processor. и ОЗУ внутри внешнего класса:CPU . Мы можем объявить внутренний класс защищенным. Следовательно, мы объявили класс RAM защищенным.
Внутри основного класса
- сначала мы создали экземпляр внешнего класса CPU с именем процессор .
- Используя экземпляр внешнего класса, мы затем создали объекты внутренних классов:
CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();
Примечание :мы используем точку (.
) для создания экземпляра внутреннего класса с использованием внешнего класса.
Доступ к членам внешнего класса во внутреннем классе
Мы можем получить доступ к членам внешнего класса, используя это ключевое слово. Если вы хотите узнать больше об этом ключевом слове, посетите Java это ключевое слово.
Пример 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
к вашему внутреннему классу, что невозможно в обычных классах. - Поскольку вложенный класс является членом окружающего его внешнего класса, вы можете использовать точку (
.
) для доступа к вложенному классу и его членам. - Использование вложенного класса сделает ваш код более читабельным и обеспечит лучшую инкапсуляцию.
- Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам внешнего/охватывающего класса, даже если они объявлены закрытыми.
java