静态类是不是只包含java中的静态方法?

Posted

技术标签:

【中文标题】静态类是不是只包含java中的静态方法?【英文标题】:Does static class contain only static method in java?静态类是否只包含java中的静态方法? 【发布时间】:2012-09-04 03:29:36 【问题描述】:

我发现静态类包含未声明为静态的方法的代码。 编译器不显示任何警告。看起来很混乱,不是吗?

【问题讨论】:

你的问题应该是Does static internal class... ? @PriyankDoshi 内部类根据定义是非静态的。 【参考方案1】:

java中没有静态类的概念(甚至没有静态内部类)。如果您看到类是静态的并且处于工作状态,那么它必须是声明为静态的内部类(也称为嵌套类)。并且没有限制在静态内部类中只有静态方法。

声明一个内部类静态的意义在于能够创建独立于它所嵌套的类的嵌套类的实例。如果未提及静态,则嵌套类的每个实例都将与其嵌套的类的实例相关联。

这个问题有更多细节。 Java inner class and static nested class

【讨论】:

嗯,那还有静态类的概念,不是吗? @MathiasSchwarz:不是真的。至少不像我们经常看到的那样。 C# 具有“静态类”,而您在此处看到的则非常不同。 @MathiasSchwarz :它是内部的,不适用于普通课程 当然,单词在其他语言中可能有其他含义,但这个问题是关于 Java 的。在 Java 中,静态类是没有指向外部类/对象的指针的内部类。 @MathiasSchwarz:但由于这个问题暗示了一种似乎来自 C# 的理解,因此它在 C# 中的其他含义 与这个问题有关。上下文很重要。【参考方案2】:

这里的答案很好,但我想我应该添加一个示例。考虑以下类定义

class Foo
    class Bar
        int x;
    

要使用 Bar 类,您必须首先创建 Foo 类的实例。

Foo foo = new Foo();
Foo.Bar bar = foo.new Bar();
bar.x = 10;

但是如果你使用了像下面这样的静态关键字

class Foo
    static class Bar
        int x;
    

你可以跳过一步

Foo.Bar bar = new Foo.Bar();
bar.x = 10;

如果你尝试在内部类不是静态的时候直接使用 Foo.Bar,那么你会得到以下错误 -

error: an enclosing instance that contains Foo.Bar is required
        Foo.Bar bar = new Foo.Bar();
                      ^
1 error

我认为这个例子应该清楚了。

【讨论】:

不错的答案 .. 它有帮助【参考方案3】:

静态类是一个嵌套类,它没有对外部类的隐式引用。静态类可以有静态方法或实例方法。注意:内部类不能有静态方法。

【讨论】:

来自 JLS 8.1.3 “内部类是一个嵌套类,没有显式或隐式声明为静态的。” docs.oracle.com/javase/specs/jls/se7/html/jls-8.html @PeterLawrey “静态类是一个嵌套类,它没有对外部类的隐式引用” - 这是我认为最重要的方面。我希望我能投票两次。 注意:本地和匿名类也是内部类,即使它们是在静态内容中定义的。即没有隐含的外部实例。【参考方案4】:

只有内部类可以声明为static。静态类没有指向其外部类的指针,因此只能引用外部类的静态字段和方法。然而,静态类本身可能包含非静态方法。

【讨论】:

“内部类”根据定义是非静态的。你的意思是“嵌套类”。【参考方案5】:

Java 中没有“静态类”之类的东西(至少不是您似乎理解的那样)。在 C# 中有一个“静态类”,它不能被实例化并且不能有非静态成员。这个概念在 Java 中并不明确存在(但是,您可以通过将所有构造函数设为 private 来获得相同的效果)。

你看到的可能是一个像这样的静态嵌套类:

class Foo 
  static class Bar 
  

这个only意味着Bar实例确实有一个外部Foo实例的引用(如果Bar有没有static 修饰符)。

Bar 可以拥有任何类型的成员,如果它是***类的话。

【讨论】:

【参考方案6】:

static 关键字对于属性/方法和类是完全不同的。

对于属性和方法,它会告诉编译器只有一个属性或方法的实例可以在没有类的活实例的情况下被引用。

static class 只能用于内部类,表示可以在没有封闭类的现有实例的情况下引用该类。因此,它对于应该从外部访问的内部枚举很有用。

但是static class 可以从它自己的身体中引用它想要的任何东西。

【讨论】:

没有。见JLS #8.1.3。您对静态方法的解释也不正确。 @EJP 我相信上面的帖子是对手头问题的直接解决,以澄清 OP 对在类(内部)的上下文中使用的静态引用的误解以及对成员的引用场地。所以我相信,非正式地,从广义上讲,他可能是对的。或者请澄清我的理解。 *我应该说嵌套而不是上面的内部

以上是关于静态类是不是只包含java中的静态方法?的主要内容,如果未能解决你的问题,请参考以下文章

Java8新特性-----接口中的默认方法和静态方法

java 类的方法是不是和静态变量一样只被加载一次放在栈中

c# 有调用一个类的静态方法,是不是执行这个类的构造函数

在java中,为啥类实例也能访问静态域?

静态方法怎么调用

请教大家关于JAVA中的静态变量和静态方法