Основы Java Core — вложенные классы в Java

Java задняя часть
Основы Java Core — вложенные классы в Java

Это 18-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

В Java класс может быть определен внутри другого класса, такой класс называется вложенным классом. Они позволяют логически группировать классы, которые используются только в одном месте, увеличивая использование инкапсуляции и создавая более читаемый и удобный для сопровождения код.

  • Область действия вложенного класса ограничена областью действия окружающего его класса.

  • Вложенные классы могут обращаться к членам вложенного класса, включая закрытые члены. Однако обратное неверно, т. е. объемлющий класс не может получить доступ к членам вложенного класса.

  • Вложенный класс также является членом окружающего его класса.

  • Как член окружающего его класса, вложенный класс может быть объявлен закрытым, общедоступным, защищенным или закрытым для пакета (по умолчанию).

  • Вложенные классы делятся на две категории:

    1. Статический вложенный класс:объявлен как вложенный классстатическийИзвестные как статические вложенные классы.
    2. внутренний класс:Внутренние классы — это нестатические вложенные классы.

грамматика:

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

статический вложенный класс

В случае нормального или обычного внутреннего класса не может быть объекта внутреннего класса без существующего объекта внешнего класса. То есть объект внутреннего класса всегда тесно связан с объектом внешнего класса. Но в случае статических вложенных классов, если нет объекта внешнего класса, может быть статический объект вложенного класса. То есть объект статического вложенного класса не имеет сильной связи с объектом внешнего класса.

Подобно методам и переменным класса, статические вложенные классы связаны со своими внешними классами. Подобно методам статического класса, статический вложенный класс не может напрямую ссылаться на переменные экземпляра или методы, определенные в охватывающем его классе: он может использовать их только через ссылки на объекты.

Получите к ним доступ, используя прилагаемое имя класса.

OuterClass.StaticNestedClass

Например, чтобы создать объект для статического вложенного класса, используйте следующий синтаксис:

OuterClass.StaticNestedClass nestedObject = 
     new OuterClass.StaticNestedClass ();
// 演示访问静态嵌套类的 Java 程序

class OuterClass
{
	// 静态对象
	static int outer_x = 10;
	
	// 实例(非静态)对象
	int outer_y = 20;
	
	// 私有对象
	private static int outer_private = 30;
	
	// 静态嵌套类
	static class StaticNestedClass
	{
		void display()
		{
			// 可以访问外部类的静态成员
			System.out.println("outer_x = " + outer_x);
			
			// 可以访问外部类的显示私有静态成员
			System.out.println("outer_private = " + outer_private);
			
			// 以下语句将给出编译错误
			// 因为静态嵌套类不能直接访问非静态成员
			// System.out.println("outer_y = " + outer_y);
		
		}
	}
}

// 驱动程序类
public class StaticNestedClassDemo
{
	public static void main(String[] args)
	{
		// 访问静态嵌套类
		OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
		
		nestedObject.display();
		
	}
}

вывод:

outer_x = 10
outer_private = 30

внутренний класс

Чтобы создать экземпляр внутреннего класса, сначала должен быть создан экземпляр внешнего класса. Затем создайте внутренний объект внутри внешнего объекта, используя следующий синтаксис:

OuterClass.InnerClass innerObject = externalObject.new InnerClass();

Есть два специальных внутренних класса:

  1. локальный внутренний класс
  2. анонимный внутренний класс
// 用于演示访问内部类的 Java 程序

class OuterClass
{
	// 静态对象
	static int outer_x = 10;
	
	// 实例(非静态)对象
	int outer_y = 20;
	
	// 私有对象
	private int outer_private = 30;
	
	// 内部类
	class InnerClass
	{
		void display()
		{
			// 可以访问外部类的静态对象
			System.out.println("outer_x = " + outer_x);
			
			// 也可以访问外部类的非静态对象
			System.out.println("outer_y = " + outer_y);
			
			// 也可以访问外部类的私有对象
			System.out.println("outer_private = " + outer_private);
		
		}
	}
}

// 驱动程序类
public class InnerClassDemo
{
	public static void main(String[] args)
	{
		// 访问内部类
		OuterClass outerObject = new OuterClass();
		OuterClass.InnerClass innerObject = outerObject.new InnerClass();
		
		innerObject.display();
		
	}
}

вывод:

outer_x = 10
outer_y = 20
outer_private = 30

Сравнение обычных или обычных классов со статическими вложенными классами

серийный номер нормальный внутренний класс статический вложенный класс
1. Не может быть объекта внутреннего класса без существующего объекта внешнего класса. То есть объекты внутреннего класса всегда связаны с объектами внешнего класса. Если объект внешнего класса не существует, могут быть статические вложенные объекты класса. То есть статические вложенные объекты класса не связаны с объектами внешнего класса.
2. В обычных/обычных внутренних классах статические члены не могут быть объявлены. В статическом вложенном классе могут быть объявлены статические члены.
3. Поскольку метод main() не может быть объявлен, обычные внутренние классы нельзя вызывать непосредственно из командной строки. Поскольку метод main() может быть объявлен, статические вложенные классы можно вызывать непосредственно из командной строки.
4. Прямой доступ возможен как к статическим, так и к нестатическим членам внешнего класса. Прямой доступ возможен только к статическим членам внешнего класса.

Это все для этой статьи

Я давно веду блог о технологиях, и это одна из моих технических статей/руководств. Надеюсь, вам это понравится! Вот краткое изложение всех моих оригинальных и исходных кодов работ:GitHub, и это блог, который я недавно создал:haiyong.site, контента в нем нет, есть какие-то HTML игры и гаджеты, можете попробовать, если интересно, исходники можете скопировать по F12 сами, или можете спросить у меня напрямую.

Если вы действительно узнали что-то новое из этой статьи, ставьте лайк, добавляйте в закладки и делитесь с друзьями. 🤗Наконец, не забудьте поставить ❤ или 📑 в поддержку.