当前位置: 首页 > 面试题库 >

为什么匿名类在静态上下文中有效

长孙昀
2023-03-14
问题内容

我对Java中的匿名类有什么误解。考虑以下简单示例:

public static void main (String[] args) throws java.lang.Exception
{
    B b = new B(){ };
    System.out.println(b.b);
}

interface B{ int b = 1; }

演示

为什么要编译代码?在JLS,CHAPT
15
说:

匿名类始终是内部类(第8.1.3节);它永远不会是静态的

但是JLS,第8章

内部类是未显式或隐式声明为static的嵌套类。

因此,匿名类是内部类。但是我们在静态上下文中使用它们。为什么这里正确?


问题答案:

可以在静态上下文中创建类而无需将其声明为静态,这就是在这里发生的情况。让我们看看被声明为静态的并在静态上下文中创建的含义:

在静态上下文中创建的匿名类与非静态上下文中创建的匿名类之间的区别在于它是否具有封闭的实例:

如果C是一个匿名类,则:

  • 如果类实例创建表达式出现在静态上下文中,则我没有立即封闭的实例。

  • 否则,i的直接封闭实例就是这个。

声明为静态的嵌套类允许使用静态成员:

内部类是未显式或隐式声明为static的嵌套类。

根据Java编程语言的常规规则,不是内部类的嵌套类可以自由声明静态成员。

通过说一个“隐式声明为静态的”嵌套类,它指的是接口内的类之类的东西:

接口的成员类是隐式静态的(第9.5节),因此永远不要将其视为内部类。

匿名类不是声明为静态的(既不是用关键字显式声明的,也不是隐式声明(例如在接口内部的)),因此不允许声明静态成员。但是,可以在静态上下文中创建它们,这意味着它们不引用封闭的实例。

由于匿名类未声明为静态,因此问题中的两个引号均保持一致。



 类似资料:
  • 我对Java中的匿名类有一个误解。考虑下面的简单例子: 演示 代码为什么编译?JLS,第15章说: 匿名类总是一个内部类(§8.1.3);它从来不是静态的 但是JLS,第8章 内部类是没有显式或隐式声明为静态的嵌套类。 所以匿名类是一个内部类。但是我们在静态上下文中使用它们。为什么这里是正确的?

  • 我真的对此感到困惑!我有2个班,俱乐部和会员。在Membership中,我有方法getMonth();在Club中,我有joinedMonth(),它接受参数'month'--所以用户输入一个月,然后我希望它返回在该特定月份加入的成员资格。 我试图从Club类调用getMonth()方法,这样我就可以继续比较月份的整数。但是,当我试图调用该方法时,我只得到提到的“非静态方法getMonth()不能

  • 问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?

  • 问题内容: 我在构建ORM库时要考虑到重用和简单性。一切都进行得很好,除了我被愚蠢的继承限制所困。请考虑以下代码: 显然,这不是我所期望的行为(尽管实际行为也很有意义)。因此,我的问题是,你们是否知道在父类中获得子类名称的意思。 问题答案: 简而言之。这不可能。在php4中,您可以实施可怕的破解(检查),但是该方法在PHP5中不起作用。参考资料: 37684 34421 编辑 :PHP 5.3中后

  • 我得到两个错误: Java:不兼容类型:无法推断类型变量R(参数不匹配;方法引用无效) 对toString的引用是不明确的,java.lang.Integer中的方法toString(int)和java.lang.Integer中的方法toString()都是不明确的 并且编译器无法推断所需的方法引用。 但是关于第二个,编译器引用的静态上下文在哪里? 这个错误与Integer类的方法toStrin

  • 可能重复: 不能从静态上下文(java)引用非静态变量 即使在这种情况下,我们也试图从静态方法访问非静态类。但这不会给出任何错误。为什么?