为什么在Java中类被声明为静态的?

16

我曾经看到在Java中将类声明为static,但却感到困惑:
由于类用于创建对象,并且不同的对象具有不同的内存分配。
那么,在声明类时,“static”是用来做什么的?这是否意味着所有的成员变量都是静态的
这有意义吗?


1
请查看此答案 - Apalala
3个回答

31

首先,您不能将顶级类设置为静态。您只能使嵌套类静态。通过使嵌套类静态,您基本上是在说您不需要一个嵌套类的实例来从外部类/顶级类中使用它。

例如:

class Outer {

static class nestedStaticClass {

//its member variables and methods (don't nessarily need to be static)
//but cannot access members of the enclosing class
}

public void OuterMethod(){
//can access members of nestedStaticClass w/o an instance
}
}

此外,除非它们是常量(换句话说,static final),否则在内部类中声明静态字段是非法的。由于静态嵌套类不是内部类,因此可以在其中声明静态成员。
引用:
类可以嵌套在嵌套类中吗?
简而言之,可以。看下面的Test,嵌套的内部类和嵌套的静态类都可以有嵌套类。但请记住,只能在顶级类中声明静态类,不能在内部类中声明它。
public class Test {
    public class Inner1 {
        public class Inner2 {
            public class Inner3 {

            }
        }
    }
    public static class nested1 {
        public static class nested2 {
            public static class nested3 {

            }
        }   
    }
}

6
按照定义,内部类是非静态的。 - assylias
@PermGenError,因此最多只有两个级别。 - Al2O3
@Rubby 你所说的“level”是什么意思?嵌套类(静态/非静态)只是顶层类的成员 :) - PermGenError
@PermGenError 嵌套类中可以嵌套类吗? - Al2O3
2
将嵌套类设为静态类基本上意味着您不需要嵌套类的实例即可从外部类/顶级类中使用它,这种说法是不正确的。您不需要外部类的实例来创建静态嵌套类的实例。"无法访问封闭类的成员"也是不正确的:它可以访问静态成员。 - user207421
@PermGenError,我对Java还很陌生。我看了你的回答和一些关于“Java中静态类”的其他内容。但是我卡在了“当我们声明一个类为静态时它有什么用处?”或者说它的好处方面。感谢你上面的回答。谢谢。 - Deepak

6

嵌套类(即在一个类内部定义的类)是唯一可以被声明为静态的类。这样做是为了不必实例化父类就可以访问嵌套类。

这个答案中有一些很好的示例代码。


2

它仅描述了此类与包含类的关系。

内部类是在另一个类的范围内定义的类。内部类的实例附加到容器类的特定实例(创建它们的实例)。

静态嵌套类是嵌套类,但是被定义为静态的。像静态成员一样,它们与特定实例没有关系;它们只属于包含类。在嵌套类中,您无法引用不带静态修饰符的包含类成员/方法,因为它们没有关联的特定实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接