Java 干货之深入理解内部类

您所在的位置:网站首页 sayhello函数是什么意思 Java 干货之深入理解内部类

Java 干货之深入理解内部类

2024-05-29 16:44| 来源: 网络整理| 查看: 265

可以将一个类定义在另一个类或方法中,这样的类叫做内部类 –《Thinking in Java》

说起内部类,大家并不陌生,并且会经常在实例化容器的时候使用到它。但是内部类的具体细节语法,原理以及实现是什么样的可以不少人都还挺陌生,这里作一篇总结,希望通过这篇总结提高对内部类的认识。

内部类是什么?

由文章开头可知,内部类的定义为:定义在另一个类或方法中的类。而根据使用场景的不同,内部类还可以分为四种:成员内部类,局部内部类,匿名内部类和静态内部类。每一种的特性和注意事项都不同,下面我们一一说明。

成员内部类

顾名思义,成员内部类是定义在类内部,作为类的成员的类。如下:

public class Outer { public class Inner{ } }

特点如下:1. 成员内部类可以被权限修饰符(eg. public,private等)所修饰2. 成员内部类可以访问外部类的所有成员,(包括private)成员3. 成员内部类是默认包含了一个指向外部类对象的引用4. 如同使用this一样,当成员名或方法名发生覆盖时,可以使用外部类的名字加.this指定访问外部类成员。如:Outer.this.name5. 成员内部类不可以定义static成员6. 成员内部类创建语法:

Outer outer=new Outer(); Outer.Inner inner=outer.new Inner(); 局部内部类

局部内部类是定义在方法或者作用域中类,它和成员内部类的区别仅在于访问权限的不同。

public class Outer{ public void test(){ class Inner{ } } }

特点如下:1. 局部内部类不能有访问权限修饰符2. 局部内部类不能被定义为static3. 局部内部类不能定义static成员4. 局部内部类默认包含了外部类对象的引用5. 局部内部类也可以使用Outer.this语法制定访问外部类成员6. 局部内部类想要使用方法或域中的变量,该变量必须是final的

在JDK1.8 以后,没有final修饰,effectively final的即可。什么意思呢?就是没有final修饰,但是如果加上final编译器也不会报错即可。匿名内部类

匿名内部类是与继承合并在一起的没有名字的内部类

public class Outer{ public List list=new ArrayList(){ { add("test"); } }; }

这是我们平时最常用的语法。匿名内部类的特点如下:1. 匿名内部类使用单独的块表示初始化块{}2. 匿名内部类想要使用方法或域中的变量,该变量必须是final修饰的,JDK1.8之后effectively final也可以3. 匿名内部类默认包含了外部类对象的引用4. 匿名内部类表示继承所依赖的类

嵌套类

嵌套类是用static修饰的成员内部类

public class Outer { public static class Inner{ } }

特点如下:1. 嵌套类是四种类中唯一一个不包含对外部类对象的引用的内部类2. 嵌套类可以定义static成员3. 嵌套类能访问外部类任何静态数据成员与方法。

构造函数可以看作静态方法,因此可以访问。为什么要有内部类?

从上面可以看出,内部类的特性和类方差不多,但是内部类有许多繁琐的细节语法。既然内部类有这么多的细节要注意,那为什么Java还要支持内部类呢?

1. 完善多重继承在早期C++作为面向对象编程语言的时候,最难处理的也就是多重继承,多重继承对于代码耦合度,代码使用人员的理解来说,并不怎么友好,并且还要比较出名的死亡菱形的多重继承问题。因此Java并不支持多继承。后来,Java设计者发现,没有多继承,一些代码友


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3