Java内部类

内部类的概念和使用

​ 类与类除了继承关系,还存在嵌套关系,即一个类可以包含另一个类。被包含的类称为内部类(Inner class),包含内部类的类称为外部类或顶层类。内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员,也可以在一个语句块的内部定义,还可以在表达式内部匿名定义。

​ 使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

访问特点

1、内部类可以直接访问外部类中的成员,包括私有成员

2、外部类要访问内部类中的成员必须要建立内部类的对象


内部类一般包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类

成员内部类,就是作为外部类的一个成员存在,与外部类的属性和方法并列。其特性如下:

1、成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

2、当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量/方法

3、在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。

4、成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的。

5、成员内部类用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。

局部内部类

局部内部类是定义在一个方法或者一个代码块中的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者代码块中。其特性为:

1、局部内部类前面不能有访问修饰符。

2、它有它自己的作用域,超出了这个范围就无效(无法使用)。

3、它可以访问外部类的所有成员(因为外部类的成员对该方法可见)。

静态内部类

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。其特性如下:

1、要创建静态内部类的对象,并不需要其外部类的对象。静态内部类随着外部类的加载而加载,可以把静态类部类理解为一个外部类

2、创建静态内部类对象:
外部类.静态内部类 对象名 = new 外部类.静态内部类(构造方法参数列表);

3、静态内部类可以有非静态成员。

4、静态内部类只能访问外部类的静态成员。

​ 当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类中的实例变量不会被分配内存。但是,类中的类变量,在该类被加载到内存时,就分配了相应的内存空间。

匿名内部类

匿名内部类就是没有名字的内部类。在使用匿名内部类时,要记住以下几个原则:

1、匿名内部类不能有构造方法。

2、匿名内部类不能定义任何静态成员、方法和类。

3、匿名内部类不能是public,protected,private,static。

4、只能创建匿名内部类的一个实例。

5、一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

6、因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

内部类的继承或实现

内部类可以继承或者实现外部其他类或者接口

好处:通过内部类的方式对类进行继承重写,或者接口进行实现。通过公共的方式对其内部类对象进行访问,因为通常内部类有可能被外部类封装其中。我们就可以t通过父类或接口的方式访问到内部类的对象。

内部类的总结

1、一般定义在类或语句块的内部,在外部引用必须使用完整名称

2、可以使用包含它的类的静态和实例成员变量,也可以使用所在方法的局部变量

3、可以定义为abstract

4、可以声明为private或protected

5、若声明为static就变成了顶层类,不能再使用局部变量

6、若想在内部类中声明任何static成员,则该类必须是static

posted @   TimQiu  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示