【问题标题】:Name of anonymous class匿名类的名称
【发布时间】:2013-10-12 19:15:55
【问题描述】:

我在描述一个类

public class MyClass{ ... }
public class Main{
    public static void main(String[] args){
        MyClass m= new MyClass(){ };
        System.out.println(m.getClass.getName);
    }
}

输出:

main.Main$1

这个输出是什么意思?我描述了匿名类,因此m 具有匿名类型。我预计会抛出 NullPointerException

【问题讨论】:

  • new MyClass(){ } 应该是什么意思?为什么要阻止?
  • @Lutz Horn:这只是一个Foo-example。实际上,主题海报可能会继承一个接口。
  • 您的示例显示任何匿名类。

标签: java anonymous-types


【解决方案1】:

NullPointerException 除外。

为什么?代码的哪一部分让你期待?

这个输出是什么意思?

您的班级中使用的匿名班级按照它们在班级中出现的顺序编号。 main.Main$1 表示这是第一个创建的匿名类。

例如,考虑这个例子:

class MyClass { }

public class Demo {

    static MyClass obj = new MyClass() { 
        { 
            System.out.println("static field: " + this.getClass().getName());
        }
    };

    MyClass obj2 = new MyClass() { 
        { 
            System.out.println("instance field: " + this.getClass().getName());
        }
    };    

    public static void main(String[] args) {
        Demo obj4 = new Demo();

        MyClass obj3 = new MyClass() { 
            { 
                System.out.println("local variable: " + this.getClass().getName());
            }
        };    

    }
}

不要担心那些块。这些只是每个匿名类中的实例初始化块。

当你执行这段代码时,你会得到如下输出:

static field: Demo$1
instance field: Demo$2
local variable: Demo$3

现在尝试将static 字段移到instance 字段之后,看看它们的名称。

【讨论】:

  • 为什么?代码的哪一部分让你期待这个? 因为没有匿名类的名称,但我正在尝试打印匿名类的名称,因此我正在尝试打印 nothing .但我之前已经解释过null 什么都不是。
  • @St.Antario 并不是没有匿名类的名称。当您编译代码时,编译器会在内部为每个匿名类生成名称。
  • 那我不明白如何实现匿名类型是什么意思?我试图推理,匿名类的每个实例都有匿名类型。
  • @St.Antario 你到底有什么疑问。您是否有机会将匿名类与泛型混合在一起。你之前问的那个问题?
  • 是的,正如我从您的错误答案之一中了解到的那样,CAP#1 是匿名类型,由编译器内部创建。我试图从匿名类中找到类似的例子,因为也没有名字。
【解决方案2】:

这个输出是什么意思?

Main$1 表示 Main 下的第一个匿名类。

注意:- $ 表示内部类

我被排除在 `NullPointerException 之外。

你为什么这么期待?请提供几个原因。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多