java的嵌套类(nested class)、内部类(inner class)的区别

嵌套类即nested class,内部类即Inner class。
概括来说,嵌套类的概念比内部类概念大。嵌套类包含内部类和非内部类。一个内部类一定是一个嵌套类,但一个嵌套类不一定是一个内部类。

在一个类内部或者接口内部声明的类是嵌套类。
下面这些类是嵌套类:

  • 一个成员类;
  • 一个局部类;
  • 一个匿名类

一个成员类的声明被另外一个类或者接口的声明直接包围。
一个局部类的声明是被一个块(block)包含。

下面的嵌套类代码示意,包含了一个成员类、一个局部类和一个匿名类:

package com.thb;

public class Test2 {
	
	// 匿名类,这个匿名类实际继承了MemberClass类
	public MemberClass concreteMember = new MemberClass() {
		public void showMessage() {		
			System.out.println("匿名类");
		}		
	};
	
	// 成员类
	class MemberClass {
		public void showMessage() {
			System.out.println("成员类");
		}
	}
	
	public void test() {
		// 局部类
		class LocalClass {}		
	}	
}

上面代码编译以后的类层次结构:
在这里插入图片描述

内部类(Inner class)首先是一个嵌套类,并且这个类没有被显式声明为static,也不是隐含着是static的。
注意:没有内部接口,因为所有的嵌套接口都隐含着是static的。

下面这些类属于内部类:

  • 一个成员类,但不是显式声明为static,也不是隐含着static的;
  • 一个局部类,但不是隐含着是static的(一个局部类不能被显式声明为static的,否则编译报错);
  • 一个匿名类

下面的这些嵌套类隐含着是static的,所以不是内部类:

  • 一个 成员枚举类;
  • 一个局部枚举类;
  • 一个成员记录类;
  • 一个局部记录类;
  • 一个接口的成员类

用static关键字显式修饰类的时候,不能修饰外部类,也不能修饰嵌套类中的局部类和匿名类,而只能修饰嵌套类中的成员类。
当然,一些局部类(即,局部枚举类和局部record类)隐含着是static的(但就是不能用static显式修饰)。因为所有嵌套的枚举类和嵌套的record类都隐含着是static的。
如果一个嵌套类用static修饰,那么就是声明这不是一个内部类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值