Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Вложенный и внутренний класс Java

Вложенный и внутренний класс Java

В этом руководстве вы узнаете о вложенном классе в Java и его типах с помощью примеров.

В Java вы можете определить класс внутри другого класса. Такой класс известен как nested class . Например,

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

В 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 защищенным.

Внутри основного класса

Примечание :мы используем точку (. ) для создания экземпляра внутреннего класса с использованием внешнего класса.

<час>

Доступ к членам внешнего класса во внутреннем классе

Мы можем получить доступ к членам внешнего класса, используя это ключевое слово. Если вы хотите узнать больше об этом ключевом слове, посетите 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

  1. Вложенный класс С#
  2. Переменные и литералы Java
  3. Java-класс и объекты
  4. Окончательное ключевое слово Java
  5. Оператор экземпляра Java
  6. Абстрактный класс Java и абстрактные методы
  7. Вложенный статический класс Java
  8. Анонимный класс Java
  9. Одноэлементный класс Java
  10. Java-отражение