难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.不同点:在任何作用域中定义的类都称之为局部内部类;匿名内部类依赖 抽象类 或接口
局部内部类:
匿名内部类:
我们可以看到的是匿名内部类必须依赖抽象类或者是接口,因为匿名内部类相当于是在构造一个对象,就是创建类的同时也是在创建对象。
2.不同点:局部内部类有类名;匿名内部类没有类名
局部内部类:
匿名内部类:
3.不同点:局部内部类可以继承;匿名内部类不能继承
局部内部类:
匿名内部类:
结果:
错误信息:
文字版:
匿名内部类不能继承其他类。
4.不同点:局部内部类可以实现接口;匿名内部类不能实现接口
局部内部类:
匿名内部类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(42, 34) java: 需要’;’
Error:(42, 46) java: 不是语句
Error:(42, 58) java: 需要’;’
Error:(44, 21) java: 需要’;’
Error:(52, 46) java: 需要’;’
Error:(52, 58) java: 不是语句
Error:(52, 70) java: 需要’;’
Error:(54, 34) java: 需要’;’
Error:(54, 46) java: 需要’;’
匿名内部类不能实现其他接口。
5.不同点:局部内部类可以定义成抽象的,故可以在内部定义抽象方法;而匿名内部类不能定义抽象方法
局部内部类:
匿名内部类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(40, 35) java: <匿名main.Main$1>不是抽象的, 并且未覆盖<匿名main.Main$1>中的抽象方法sayAbstractMethod()
Error:(56, 47) java: <匿名main.Main$2>不是抽象的, 并且未覆盖<匿名main.Main$2>中的抽象方法sayAbstractMethod()
匿名内部类中不能定义抽象方法。
6.相同点:局部内部类可以被 实例化 ;匿名内部类也可以被实例化
局部内部类:
匿名内部类:
7.相同点:局部内部类中可以定义public、 protected 、package- private 、private四种访问修饰符;匿名内部类中也可以定义public、protected、package-private、private四种访问修饰符
局部内部类:
匿名内部类:
8.相同点:局部内部类中不能定义 静态变量 、 静态方法 和静态最终方法;匿名内部类中也不能定义静态变量、静态方法和静态最终方法
局部内部类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(32, 38) java: 已在类 People中定义了方法 say()
Error:(20, 31) java: 内部类People中的静态声明非法
修饰符 ‘static’ 仅允许在常量变量声明中使用
Error:(25, 32) java: 内部类People中的静态声明非法
修饰符 ‘static’ 仅允许在常量变量声明中使用
局部内部类中不能定义静态变量、静态方法和静态最终方法。
匿名内部类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(57, 38) java: 已在类 <匿名main.Main$1>中定义了方法 say()
Error:(45, 31) java: 内部类<匿名main.Main$1>中的静态声明非法
修饰符 ‘static’ 仅允许在常量变量声明中使用
Error:(50, 32) java: 内部类<匿名main.Main$1>中的静态声明非法
修饰符 ‘static’ 仅允许在常量变量声明中使用
Error:(87, 38) java: 已在类 <匿名main.Main$2>中定义了方法 say()
Error:(75, 31) java: 内部类<匿名main.Main$2>中的静态声明非法
修饰符 ‘static’ 仅允许在常量变量声明中使用
Error:(80, 32) java: 内部类<匿名main.Main$2>中的静态声明非法
修饰符 ‘static’ 仅允许在常量变量声明中使用
匿名内部类中也不能定义静态变量、静态方法和静态最终方法。
9.相同点:局部内部类中可以定义非静态变量、常量、静态常量、非静态方法和最终方法;匿名内部类中也可以定义非静态变量、常量、静态常量、非静态方法和最终方法
局部内部类:
匿名内部类:
使用内部类的令人信服的理由包括:
它是一种逻辑分组仅在一个地方使用的类的方法:如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的。 嵌套这样的“帮助类”使得它们的包更加简化。
它增加了封装:考虑两个顶级类A和B,其中B需要访问A的成员,否则这些成员将被声明为私有。 通过将类B隐藏在类A中,可以将A的成员声明为私有,并且B可以访问它们。 另外,B本身可以隐藏在外面。
它可以带来更易读和可维护的代码:在顶级类中嵌套小类会使代码更接近于使用它的位置。
总结
- 不同点:在任何作用域中定义的类都称之为局部内部类;匿名内部类依赖抽象类或接口
- 不同点:局部内部类有类名;匿名内部类没有类名
- 不同点:局部内部类可以继承;匿名内部类不能继承
- 不同点:局部内部类可以实现接口;匿名内部类不能实现接口
- 不同点:局部内部类可以定义成抽象的,故可以在内部定义抽象方法;而匿名内部类不能定义抽象方法
- 相同点:局部内部类可以被实例化;匿名内部类也可以被实例化
- 相同点:局部内部类中可以定义public、protected、package-private、private四种访问修饰符;匿名内部类中也可以定义public、protected、package-private、private四种访问修饰符
- 相同点:局部内部类中不能定义静态变量、静态方法和静态最终方法;匿名内部类中也不能定义静态变量、静态方法和静态最终方法
- 相同点:局部内部类中可以定义非静态变量、常量、静态常量、非静态方法和最终方法;匿名内部类中也可以定义非静态变量、常量、静态常量、非静态方法和最终方法
至此,Java中局部内部类与匿名内部类详解对比相关内容讲解先告一段落,更多内容请持续关注。
附:匿名内部类学习资料
没有学习过的同学或者是不太清楚局部内部类的同学也别急,可以点击下面局部内部类学习资料来进行学习。
附:类学习资料
附:抽象类学习资料
附:接口学习资料
附:内部类学习资料
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第一百一十一章:内部类可以被覆盖吗?
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!