首页 > 解决方案 > 匿名类中的超级(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());

标签: javaanonymous-class

解决方案


问题:为什么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构造访问。


推荐阅读