首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们不能在(非静态)内部类中使用静态方法(Java 16之前的版本)?

为什么我们不能在(非静态)内部类中使用静态方法(Java 16之前的版本)?
EN

Stack Overflow用户
提问于 2009-06-10 11:52:05
回答 9查看 73.4K关注 0票数 148

为什么我们不能在非静态内部类中使用静态方法呢?

代码语言:javascript
复制
public class Foo {
    class Bar {
        static void method() {} // Compiler error
    }
}

如果我把内部类设为静态的,它就能工作。为什么?

代码语言:javascript
复制
public class Foo {
    static class Bar { // now static
        static void method() {}
    }
}

在Java 16+中,这两个都是有效的。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-06-10 12:02:38

由于内部类的实例与其外部类的实例隐式关联,因此它本身不能定义任何静态方法。由于静态嵌套类不能直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

票数 113
EN

Stack Overflow用户

发布于 2012-05-08 13:09:43

唯一的原因是“不是必须的”,那么为什么还要费心去支持它呢?

从语法上讲,没有理由禁止内部类具有静态成员。尽管Inner的一个实例与Outer的一个实例相关联,但是如果java决定这样做的话,仍然可以使用Outer.Inner.myStatic来引用Inner的静态成员。

如果您需要在所有Inner实例之间共享某些内容,只需将它们作为静态成员放入Outer即可。这并不比在Inner中使用静态成员更糟糕,在这种情况下,Outer仍然可以访问Inner的任何私有成员(不会改进封装)。

如果您需要在由一个outer对象创建的所有Inner实例之间共享某些内容,将它们作为普通成员放入Outer类中会更有意义。

我不同意“静态嵌套类几乎只是一个顶级类”的观点。我认为真正将静态嵌套类/内部类视为外部类的一部分会更好,因为它们可以访问外部类的私有成员。外部类的成员也是“内部类的成员”。因此不需要在内部类中支持静态成员。外部类中的一个普通/静态成员就足够了。

票数 7
EN

Stack Overflow用户

发布于 2021-03-22 03:34:18

JDK16添加记录的工作还提到,静态方法和字段现在可以与内部类一起使用,甚至允许main()启动该类。

例如,这段代码在JDK16中编译和运行,并且可以选择作为java Outerjava Outer$Inner运行main()

代码语言:javascript
复制
public class Outer {
    public static void main(String[] args) {
        System.out.println("Outer class main xxx="+Inner.xxx+" nnn="+(++Inner.nnn)+" iii="+(--iii));
        aaa();
        Inner.zzz();
    }
    public static void aaa() {
        System.out.println("aaa() nnn="+(++Inner.nnn)+" iii="+(--iii));
    }
    public static int iii = 100;

    class Inner {
        public static final String xxx= "yyy";
        public static int nnn = 0;

        public static void zzz() {
            System.out.println("zzz() "+" nnn="+(++nnn)+" iii="+(--iii));
        }
        public static void main(String[] args) {
            System.out.println("Inner class main xxx="+xxx+" nnn="+(++nnn)+" iii="+(--iii));
            zzz();
            aaa();
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/975134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档