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

匿名内部类和Final修饰符[重复]

司徒骞尧
2023-03-14
问题内容

这个问题已经在这里有了答案

匿名内部类显示不正确的修饰符 (4个答案)

去年关闭。

据我正确理解 anonymous classes总是final

这已经在 JLS 15.9.5

但是,当我运行以下代码来检查它是否显示Inner该类不是final

    public class Test{
    static class A<T> {
    }
    public static void main(String arg[]) {
        A<Integer> obj = new A() {
        };
        if ((obj.getClass().getModifiers() & Modifier.FINAL) != 0) {
            System.out.println("It is a final  " + obj.getClass().getModifiers());
        } else {
            System.out.println("It is not final " + obj.getClass().getModifiers());
        }
    }
}

上面程序的输出是:

It is not final 0

请清除我的疑问,因为我无法理解此行为。


问题答案:

显式 是在源代码中写的东西。因此,如果将某些东西声明为public final class,则意味着该类是 明确的final

隐式 不是在源代码中写下的,而是在某种构造的上下文中或基于语言规则的情况下,元素的行为与使用指定修饰符声明的行为相同。

例如,enum声明中的关键字enum SomeEnum { }导致SomeEnumfinal,因为语言规则对其进行了规定。其效果与关键字的效果相同final

匿名类隐式最终的示例是因为不存在任何语言构造可覆盖匿名类。因此,它的行为就像是final。我认为“有效”一词在这里更好。

但是,您不能基于反射呈现事物的方式做出假设。考虑以下代码段:

public class Test {
    interface SomeInterface { }
    abstract interface SomeAbstractInterface { }
    static abstract class SomeAbstractClass { }
    enum SomeEnum { }

    public static void main(String arg[]) {
        System.out.println(Modifier.toString(SomeInterface.class.getModifiers()));
        System.out.println(Modifier.toString(SomeAbstractInterface.class.getModifiers()));
        System.out.println(Modifier.toString(SomeAbstractClass.class.getModifiers()));
        System.out.println(Modifier.toString(SomeEnum.class.getModifiers()));
    }
}

结果是这样的:

abstract static interface
abstract static interface
abstract static
static final

无论interfaceabstract interface被认为是一个抽象接口。通过反射它们也被认为是静态的。显然,在解析和编译Java源代码的过程中,可以删除或添加一些修饰符。



 类似资料:
  • 问题内容: 据我了解,以下代码应已打印为输出。 但是,当我运行此代码时,它正在打印。 来自Java文档 匿名类15.9.5。: 匿名类始终是隐式最终的 为什么这段代码会这样? 问题答案: 请注意,自那时以来,该特定部分的JLS中的措词已发生重大变化。现在(JLS 11)显示: 15.9.5。匿名类声明: 匿名类永远不会是最终的(第8.1.1.2节)。 匿名类不是最终的事实与强制转换有关,尤其是强制

  • 据我所知,以下代码应该已打印为输出。 但是,当我运行此代码时,它正在打印。 来自匿名类15.9.5的Java文档: 匿名类总是隐式最终的 为什么这个代码会这样?

  • 主要内容:final 修饰变量,final修饰方法,final修饰类,final 修饰符使用总结final 在 Java 中的意思是最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。final 应用于类、方法和变量时意义是不同的,但本质是一样的,都表示不可改变,类似 C# 里的 sealed 关键字。 使用 final 关键字声明类、变量和方法需要注意以下几点: final 用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。 final 用在方法的前面表示方法不可以

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除