为了账号安全,请及时绑定邮箱和手机立即绑定

带有静态方法的 Java 内部类

带有静态方法的 Java 内部类

拉风的咖菲猫 2023-02-16 17:02:06
我知道这个问题有点简单,但我真的想知道为什么而不是去文档假设我有这样的课程。public class OuterClass{public static void main(String[] args)throws Exception{    System.out.println(OuterClass.InnerClass.yearOfBorn);//works ok    System.out.println(OuterClass.InnerClass.returnYearOfBorn());//not works    System.out.println(OuterClass.InnerClass.returnYearOfBornAsPublic());//not works}    private final class InnerClass{    private static final int yearOfBorn=13;    private static int returnYearOfBorn(){        return yearOfBorn;    }            public static int returnYearOfBornAsPublic(){        return yearOfBorn;    }            }}两种静态方法都抛出错误说明修饰符 'static' 只允许在常量变量声明中使用我知道文档指出这在 Java 语言规范部分§8.1.3 中有描述8.1.3 内部类和封闭实例An inner class is a nested class that is not explicitly or implicitly declared static. Inner classes may not declare static initializers (§8.7) or member interfaces. Inner classes may not declare static members, unless they are compile-time constant fields (§15.28).但我的问题是调用简单值或属性与调用静态方法的区别是什么,无论是公共的还是私有的?为什么可以调用属性而不是方法。
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

非静态内部类有一些特别之处。


静态内部类没有。顶级课程没有它。任何内部接口或枚举都没有。


那个特殊的东西是一个看不见的领域。


这个不可见的字段是类型Outer,它是final。它在其构造函数中被初始化为第一件事,并且,是的,非静态内部类的每个构造函数都有一个神奇的不可见参数,类型为 ,用作Outer此字段。


所以,当你写:


public class Outer {

    public class Inner {

    }

}

编译器将像您实际编写的那样编译此代码:


public class Outer {

    public static class Inner {

        private final Outer I_AM_MAGIC;


        public Inner(Outer outer) {

            this.I_AM_MAGIC = outer;

        }

    }

}

你可以使用javap反编译工具看到这个隐藏的魔法;通过-verbose,-private你会看到这些。这种魔法存在的原因是您可以从内部调用外部的实例方法,但是..您在什么实例上调用这些外部方法?在那个隐藏的实例上!


请注意,这段奇异的、看似怪异的代码:someOuter.new Inner()实际上是合法的 Java 代码。当new Inner()从 中的非静态上下文中调用时Outer,this实例作为不可见参数传递给该构造函数,但如果您不在那里,代码根本不会编译......除非您使用语法outer.new Inner()。


编译器会阻止您添加静态方法的原因是Inner它被认为会导致一些混乱。基本上,你的问题的答案是:“没有充分的理由......只是......规范说java编译器不能允许它,因此,javac不允许它”。


请注意,实际上这些非静态内部类是令人困惑的东西。我强烈建议你教自己总是做你的内部课程static,除非你真的知道你在做什么。即使那样,也要三思。然后再三思。然后也许考虑制作一个非静态内部类。


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信