难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.匿名内部类成员
我们先在匿名内部类里面定义所有的成员,然后再看看哪些是不能定义的。
演示:
请在Main类中定义一个抽象内部类People。
在Main类main()方法中创建一个People的匿名内部类对象。
在匿名内部类中定义实例变量、常量、静态变量、静态常量、实例方法、最终方法、抽象方法、静态方法、静态最终方法。
请观察程序运行结果。
代码:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(20, 38) java: <匿名main.Main$1>不是抽象的, 并且未覆盖<匿名main.Main$1>中的抽象方法say(double)Error:(35, 24) java: 内部类<匿名main.Main$1>中的静态声明非法 修饰符 'static' 仅允许在常量变量声明中使用Error:(70, 25) java: 内部类<匿名main.Main$1>中的静态声明非法 修饰符 'static' 仅允许在常量变量声明中使用Error:(79, 31) java: 内部类<匿名main.Main$1>中的静态声明非法 修饰符 'static' 仅允许在常量变量声明中使用
从运行结果来看,匿名内部类里面有一些成员是不可以定义的。
第一个就是抽象方法不能定义,我们去掉:
第二个就是静态成员除了静态常量以外都不能定义,也去掉:
好,剩下的成员都可以定义:
执行结果:
至此,我们知道了在匿名内部类里面可以定义以下成员:
实例变量、常量、静态常量、实例方法、最终方法。
没有学习过的同学或者是不太清楚局部内部类的同学也别急,可以点击下面局部内部类学习资料来进行学习。
附:局部内部类学习资料
全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
全栈2019”Java第九十七章:在方法中访问局部内部类成员详解
全栈2019”Java第九十八章:局部内部类访问作用域成员详解
“全栈2019”Java第一百章:局部内部类可以实现接口吗?
“全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解
“全栈2019”Java第一百零二章:哪些作用域可以声明局部内部类?
2.匿名内部类中定义的成员只能在匿名内部类里访问
匿名内部类中的成员只能在类体中访问,出了类体谁也捕获不了。
演示:
请在Main类中定义一个抽象内部类People。
在Main类main()方法中创建一个People的匿名内部类对象。
在匿名内部类中定义实例变量、常量、静态常量、实例方法和最终方法。
请观察程序运行结果。
代码:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(55, 50) java: 找不到符号 符号: 变量 anInt 位置: 类型为main.Main.People的变量 peopleError:(57, 48) java: 找不到符号 符号: 变量 anFinalInt 位置: 类型为main.Main.People的变量 peopleError:(59, 52) java: 找不到符号 符号: 变量 anStaticFinalInt 位置: 类型为main.Main.People的变量 peopleError:(61, 15) java: 找不到符号 符号: 方法 say() 位置: 类型为main.Main.People的变量 peopleError:(63, 15) java: 找不到符号 符号: 方法 say(int) 位置: 类型为main.Main.People的变量 people
从运行结果来看,我们的程序出现了一些错误。别急,一个一个来解决。
首先,错误报的都是找不到符合,在哪找不到符合呢?
在People类里面找不到符合,分别找不到我们定义在匿名内部类里面的五个成员。这就说明我们在匿名内部类定义的成员,不能被People类(也就是被实现的抽象类,还可以是接口)识别。
为什么呢?
因为我们匿名内部类本身是一个表达式,它不是一个类存在的形式,而且它还没有名字。再者,我们的类型是抽象类或者是接口,例如此例中引用people的引用类型是People类,我们用People去调用它本身不存在的变量或者方法,它肯定会报找不到符号异常。
我们调用people里面的这些变量和方法都是去People类里面去找,不会去匿名内部类里面去找。这个之前在讲类的时候讲过-方法的静态绑定和动态绑定。本章的总结处有相应学习资料链接。
3.作用域访问匿名内部类成员
上一小节我们刚刚了解到匿名内部类成员只能在类体中使用,所以作用域不能访问匿名内部类里的成员。
4.匿名内部类访问作用域成员
演示:
请在Main类中定义一个抽象内部类People。
在Main类main()方法中创建一个People的匿名内部类对象。
在main()方法中定义变量和常量。
匿名内部类访问作用域内的变量和常量。
请观察程序运行结果。
代码:
Main类:
结果:
从运行结果来看,程序没有任何问题。
我们简单的来看一下程序。首先,我们来看一下静态抽象内部类People:
为什么是静态抽象内部类呢?
因为我们要在静态方法里面使用匿名内部类:
所以,抽象内部类必须是静态的。
我们可以看到在静态抽象内部类里面定义了一个抽象方法:
目的是创建了匿名内部类对象以后有方法可以调用,这是其一。其二是匿名内部类里面要有一个方法去访问到作用域内的成员,所以需要定义一个抽象方法。
我们也可以看到抽象方法去访问到作用域内的成员:
继续往下看:
使用匿名内部类对象调用其方法。执行结果:
到这里,程序执行完毕!
总结
- 匿名内部类里面可以定义实例变量、常量、静态常量、实例方法和最终方法。
- 作用域无法直接访问到匿名内部类里面的成员。
- 匿名内部类可以直接访问到作用域中的成员。
至此,Java中匿名内部类与作用域成员互访相关内容讲解先告一段落,更多内容请持续关注。
附:类学习资料
全栈2019”Java第三十九章:构造函数、构造方法、构造器
全栈2019”Java第五十一章:继承与final关键字详解
附:抽象类学习资料
全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型
附:接口学习资料
附:内部类学习资料
全栈2019”Java第七十一章:外部类访问静态内部类成员详解
全栈2019”Java第七十三章:外部类里多个静态非静态内部类详解
全栈2019”Java第七十四章:内部类与静态内部类相互嵌套
全栈2019”Java第七十六章:静态、非静态内部类访问权限
全栈2019”Java第七十七章:抽象内部类与抽象静态内部类详解
全栈2019”Java第八十章:外部类是否能实现本类中的接口?
全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?
全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?
全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)
全栈2019”Java第九十章:内部类可以向上或向下转型吗?
全栈2019”Java第九十二章:外部类与内部类成员覆盖详解
全栈2019”Java第九十三章:内部类应用场景(迭代器设计模式)
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第一百零五章:匿名内部类覆盖作用域成员详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!