Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们不能在[public]内部类中声明静态方法,除非这些内部类也声明为静态的呢_Java_Class_Syntax_Static - Fatal编程技术网

Java 为什么我们不能在[public]内部类中声明静态方法,除非这些内部类也声明为静态的呢

Java 为什么我们不能在[public]内部类中声明静态方法,除非这些内部类也声明为静态的呢,java,class,syntax,static,Java,Class,Syntax,Static,可能重复: 大家好,在java中,我们不能在[public]内部类中声明静态方法的原因到底是什么,除非这些内部类也声明为静态的 令人惊讶的是,顶级类可以有任意数量的静态方法,而不需要任何特殊的修饰符非静态内部类只能在外部类实例的上下文中出现 所以。。。如果要使用静态方法,则整个内部类必须是静态的。如果不这样做,就无法保证在尝试调用静态方法时内部类存在 要问的问题是——如果在内部类中确实有一个静态方法,那么如何调用该静态方法?答案是,你不能 内部类绑定到外部类的实例 从有效的Java--“非静态

可能重复:

大家好,在java中,我们不能在[public]内部类中声明静态方法的原因到底是什么,除非这些内部类也声明为静态的


令人惊讶的是,顶级类可以有任意数量的静态方法,而不需要任何特殊的修饰符

非静态内部类只能在外部类实例的上下文中出现

所以。。。如果要使用静态方法,则整个内部类必须是静态的。如果不这样做,就无法保证在尝试调用静态方法时内部类存在

要问的问题是——如果在内部类中确实有一个静态方法,那么如何调用该静态方法?答案是,你不能

内部类绑定到外部类的实例

从有效的Java--“非静态[嵌套]类的每个实例都隐式地与其包含类的封闭实例关联”


这就是使“内部”类保持静态的原因。这实际上是一个静态嵌套类,它是一个完整的类,只是为了便于打包而存在于封闭类中。

为什么
OuterClass.InnerClass.staticMethod()
不能工作?一个内部类只是一个普通类,带有对封闭类实例的隐藏引用。@SoftwareMonkey--很好。这里是一个陷阱——类加载器除了在外部类的实例的上下文中之外没有访问内部类的权限,这就是为什么您不能像上面提到的那样做的原因。因为其他语言没有这种限制。你错了,@Kal。类加载器完全可以访问内部类,而不需要外部类的实例。只有内部类的实例才能在没有外部类实例的情况下存在。通过
OuterClass.InnerClass.Class
获取一个
Class
实例来验证这一点很简单,然后可以将其反映到上。禁止在此类类上使用静态方法的决定可能是出于概念/设计动机。就个人而言,我不认为这是一个很好的例子,但不管怎样,你给出的理由都是胡说八道。如果你创建了一个私有的、非静态的嵌套类,“私有”不是意味着外部类在访问嵌套类的实例时已经有了一个实例吗?这完全是错误的。它是存在于外部类上下文中的内部类的实例,这仅仅是因为对外部类有一个隐式和隐藏的引用。这与类定义无关。