java - 匿名类中的超级(Java)
问题描述
假设我们有代码:
public class Solution {
private String name;
private String surname;
Solution(String name, String surname) {
this.name = name;
this.surname = surname;
}
private String getPrivate() { return name; }
public String getPublic() { return surname; }
private void sout() {
new Solution("Anonim private", "Anonim public") {
void printName() {
System.out.println(getPrivate()); // Main private
//System.out.println(this.getPrivate()); // can't compile
System.out.println(super.getPrivate()); // Anonym private
System.out.println(Solution.this.getPrivate()); // Main private
System.out.println("\n");
System.out.println(getPublic()); // Anonym public
System.out.println(this.getPublic()); // Anonym public
System.out.println(super.getPublic()); // Anonym public
System.out.println(Solution.this.getPublic()); // Main public
}
}.printName();
}
public static void main(String[] args) {
new Solution("Main private", "Main public").sout();
}}
评论 - 我们的输出(通过 intellij idea)
问题:为什么super.getPrivate()
返回字符串"Anonym private"
?
如果我们查看 Java 文档,我们会看到
如果您的方法覆盖了它的超类的方法之一,您可以通过使用关键字 super 来调用被覆盖的方法。
但是在这种情况下,获得了super
单词的另一种含义:内部类的实例。您可以检查它添加:
System.out.println(super.getClass());
System.out.println(this.getClass());
解决方案
问题:为什么
super.getPrivate()
返回字符串"Anonym private"
?如果我们查看 Java 文档,我们会看到
如果您的方法覆盖了其超类的方法之一,您可以通过使用关键字来调用被覆盖的方法
super
。但是在这种情况下,获得了
super
单词的另一种含义:内部类的实例。
super
不,你引用的意思是这里适用的意思。上下文是这样的:
private class Solution {
[...]
private void sout() { new Solution("Anonim private", "Anonim public") { void printName() {
[...]
System.out.println(super.getPrivate());
你已经认识到上下文是一个内部类的方法,所以第一个要回答的问题是那个内部类的超类是什么,它super
指的是什么?但这很简单:它的超类是Solution
——这就是“ new Solution(...)
”部分的意思。
下一个要问的问题是该实例的属性是什么?这也很容易:它是通过与提供的参数匹配的构造函数对其进行初始化的结果。因此,super.getPrivate()
读回其中的第一个是完全自然和预期的。
由于内部类不覆盖getPrivate()
,因此super
无需使用 —— 通过调用getPrivate()
内部类实例本身获得相同的结果,无论是在内部类实现内部还是外部。
这些都与内部类的包含类的包含实例无关。包含类也是 Solution
为了迷惑和挑战你。包含实例是与内部类实例分开的对象。它与内部类实例(即所有)同名的方法和变量对内部类实例是隐藏的,只能通过Solution.this
构造访问。
推荐阅读
- java - 尝试使用 setImageResource 时应用程序崩溃
- r - 用另一个数据框填充一个数据框
- microsoft-graph-api - 跟随 DeltaLink 时出现 ErrorCannotUseItemIdForFolderId
- javascript - 如何从普通的旧 c++ 函数调用 javascript(node.js) 函数?
- c - 如何在一段时间内重复一个过程,直到按下输入?
- javascript - 通过可调用函数传递的 Firestore 时间戳
- mysql - 错误 2002 (HY000): 无法通过套接字 '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' 连接到本地 MySQL 服务器
- python - 如何从导入的文件中获取调用导入文件的函数的文件的路径
- python - 使用二元、非二元变量的多元线性回归
- javascript - 延迟加载图像,但如果它们再次移出框架则中止