Java中的静态类

在java中有什么像static class

这样的class级是什么意思? 静态类的所有方法都需要static吗?

是否需要反过来,如果一个类包含了所有的静态方法,那么这个类是否也是静态的?

什么是静态类适合?

Java有静态的嵌套类,但是这听起来像是在寻找一个顶级的静态类。 Java没有办法使顶层类成为静态的,但是你可以像这样模拟一个静态类:

  • final声明你的类 – 防止扩展类,因为扩展一个静态类是没有意义的
  • 使构造函数为private – 阻止客户端代码实例化,因为实例化一个静态类是没有意义的
  • 使类的所有成员和函数static – 由于类不能被实例化,因此不能调用实例方法或访问实例字段
  • 请注意,编译器不会阻止您声明一个实例(非静态)成员。 只有当您尝试调用实例成员时,问题才会显示

上面每个build议的简单例子:

 public class TestMyStaticClass { public static void main(String []args){ MyStaticClass.setMyStaticMember(5); System.out.println("Static value: " + MyStaticClass.getMyStaticMember()); System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember()); // MyStaticClass x = new MyStaticClass(); // results in compile time error } } // A top-level Java class mimicking static class behavior public final class MyStaticClass { private MyStaticClass () { // private constructor myStaticMember = 1; } private static int myStaticMember; public static void setMyStaticMember(int val) { myStaticMember = val; } public static int getMyStaticMember() { return myStaticMember; } public static int squareMyStaticMember() { return myStaticMember * myStaticMember; } } 

静态类有什么好处? 静态类的一个很好的使用是定义一次性的,实用的和/或库类,其中实例化是没有意义的。 一个很好的例子是math类包含一些math常数,如PI和E,只是提供math计算。 在这种情况下要求实例化将是没有必要和混乱的。 请参阅Java的Math类 。 注意它是最终的,它的所有成员都是静态的。 如果Java允许顶级类声明为静态,那么Math类确实是静态的。

那么,Java有“静态嵌套类”,但它们与C#的静态类并不相同,如果这就是你来自的地方。 一个静态嵌套类只是一个不隐式地引用外部类的实例。

静态嵌套类可以有实例方法和静态方法。

Java中没有这样的顶级静态类。

有一个静态的嵌套类 ,这个[静态嵌套]类不需要封闭类的实例来实例化自己。

这些类[静态嵌套的]只能访问封闭类的静态成员[因为它没有任何引用封闭类的实例…]

代码示例:

 public class Test { class A { } static class B { } public static void main(String[] args) { /*will fail - compilation error, you need an instance of Test to instantiate A*/ A a = new A(); /*will compile successfully, not instance of Test is needed to instantiate B */ B b = new B(); } } 

是的,在java中有一个静态的嵌套类。 当你声明一个嵌套的类静态时,它会自动成为一个独立的类,它可以被实例化,而不必实例化它所属的外部类。

例:

 public class A { public static class B { } } 

因为class B声明为静态,所以可以显式实例化为:

 B b = new B(); 

请注意,如果class B没有被声明为静态以使其独立,则实例对象调用将如下所示:

 A a= new A(); B b = a.new B(); 

当一个class的成员被声明为static时发生了什么? 该成员可以被访问而不需要实例化class 。 因此,使外部类(顶级类) static没有意义。 所以这是不允许的。

但是你可以设置内部类为静态(因为它是顶级类的成员)。 那么这个类可以被访问而不需要实例化顶层类。 考虑下面的例子。

 public class A { public static class B { } } 

现在,在不同的类C ,可以访问类B而不需要创build类A的实例。

 public class C { AB ab = new AB(); } 

static类也可以有non-static成员。 只有类变得静止。

但是,如果将static关键字从类B删除,则无法直接访问,而无需创buildA的实例。

 public class C { A a = new A(); AB ab = a. new B(); } 

但是我们不能在non-static内部类中有static成员。

外部类不能是静态的,但嵌套/内部类可以。 基本上可以帮助您使用嵌套/内部类而不创build外部类的实例。

看到这是谷歌“静态类java”最好的结果,最好的答案是不在这里,我想我会添加它。 我将OP的问题解释为关于C#中的静态类,在Java世界中被称为单例。 对于那些不知道,在C#中的“静态”关键字可以应用到类声明,这意味着结果类永远不能实例化。

摘自Joshua Bloch的“Effective Java – Second Edition”(被广泛认为是最好的Java风格指南之一):

从1.5版本开始,还有第三种方法来实现单身人士。 只需要使用一个元素创build一个枚举types:

 // Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 

这种方法在function上等同于公共领域的方法,除了它更简洁,提供了免费的序列化机制,并且提供了对多重实例化的铁证,即使面对复杂的序列化或reflection攻击。 虽然这种方法尚未被广泛采用,但是单元枚举types是实现单例的最好方法。 (重点作者)

布洛赫,约书亚(2008-05-08)。 有效的Java(Java系列)(p。18)。 培生教育。

我认为实施和理由是相当自我解释的。

在Java中,类可以是静态的吗?

答案是YES ,我们可以在java中拥有静态类。 在Java中,我们有静态实例variables以及静态方法静态块 。 在Java中,类也可以是静态的。

在java中,我们不能使顶层(外层)类是静态的。 只有嵌套的类可以是静态的。

静态嵌套类与非静态嵌套类

1)嵌套静态类不需要Outer类的引用,但非静态嵌套类或Inner类需要Outer类引用。

2)内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员。 静态类不能访问Outer类的非静态成员。 它只能访问Outer类的静态成员。

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Java有与类关联的静态方法(例如java.lang.Math只有静态方法),但类本身不是静态的。