Java核心基础知识——Java 中的嵌套类

举报
海拥 发表于 2021/08/18 13:37:28 2021/08/18
【摘要】 在 Java 中,可以在另一个类中定义一个类,这样的类称为嵌套类。它们使您能够对仅在一个地方使用的类进行逻辑分组,从而增加封装的使用,并创建更具可读性和可维护性的代码。嵌套类的范围受其封闭类的范围限制。嵌套类可以访问嵌套类的成员,包括私有成员。然而,反之则不然,即封闭类不能访问嵌套类的成员。嵌套类也是其封闭类的成员。作为其封闭类的成员,嵌套类可以声明为private、public、prote...

在 Java 中,可以在另一个类中定义一个类,这样的类称为嵌套类。它们使您能够对仅在一个地方使用的类进行逻辑分组,从而增加封装的使用,并创建更具可读性和可维护性的代码。

  • 嵌套类的范围受其封闭类的范围限制。

  • 嵌套类可以访问嵌套类的成员,包括私有成员。然而,反之则不然,即封闭类不能访问嵌套类的成员。

  • 嵌套类也是其封闭类的成员。

  • 作为其封闭类的成员,嵌套类可以声明为private、public、protected或package private(默认)。

  • 嵌套类分为两类:

    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 如果大家能给我的 Github 存储库上添一些星星就更好了😊。

我已经写了很长一段时间的技术博客,这是我的一篇 Python 3.10 和 Python 3.9 之间的差异教程。我乐于通过文章分享技术与快乐。您可以访问我的博客主页: 华为云-海拥海拥以了解更多信息。希望你们会喜欢!

💌 欢迎大家在评论区提出意见和建议!💌

如果你真的从这篇文章中学到了一些新东西,喜欢它,收藏它并与你的小伙伴分享。🤗最后,不要忘了❤或📑支持一下哦。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。