Java中的静态类

Static Classes In Java

在Java中有什么类似EDOCX1 0吗?

这个班的意思是什么?静态类的所有方法也需要是EDOCX1[1]吗?

如果一个类包含所有静态方法,那么该类是否也应该是静态的呢?

静态类有什么好处?


Java有静态嵌套类,但听起来像是在寻找顶级静态类。Java无法使顶级类静态化,但可以模拟这样的静态类:

  • 声明类final—由于扩展静态类毫无意义,因此阻止类的扩展
  • 使构造函数private-防止客户端代码实例化,因为实例化静态类没有意义
  • 使类的所有成员和函数都成为static—因为类不能实例化,所以不能调用实例方法或访问实例字段
  • 请注意,编译器不会阻止您声明实例(非静态)成员。只有在您尝试调用实例成员时才会出现此问题。

以上建议的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
    }
}

静态类有什么好处?静态类的一个很好的用途是定义一次性、实用程序和/或库类,在这些类中实例化是没有意义的。一个很好的例子是数学类,它包含一些数学常数,比如pi和e,并且只提供数学计算。在这种情况下,需要实例化是不必要的,而且很混乱。参见Math类和源代码。请注意,它是final,它的所有成员都是static。如果Java允许顶级类被声明为static,那么数学类确实是静态的。


JAVA有"静态嵌套类",但是它们和C的静态类完全不同,如果你来自的话。静态嵌套类只是一个没有隐式引用外部类实例的类。

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

Java中没有顶级静态类。


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

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

代码示例:

1
2
3
4
5
6
7
8
9
10
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中有一个静态嵌套类。当您声明一个嵌套类static时,它将自动成为一个独立的类,可以在不必实例化它所属的外部类的情况下对其进行实例化。

例子:

1
2
3
4
5
6
7
public class A
{

 public static class B
 {
 }
}

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

1
B b = new B();

注意:如果class B不是声明为static以使其独立,则实例对象调用将如下所示:

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


class中的成员被宣布为static时,会发生什么?可以在不实例化class的情况下访问这些成员。因此,使外部类(顶层类)static没有意义。因此是不允许的。

但是您可以将内部类设置为静态的(因为它是顶级类的成员)。然后可以在不实例化顶级类的情况下访问该类。考虑下面的例子。

1
2
3
4
5
public class A {
    public static class B {

    }
}

现在,在一个不同的类C中,不需要创建类A的实例就可以访问类B

1
2
3
public class C {
    A.B ab = new A.B();
}

static类也可以有non-static个成员。只有类是静态的。

但是,如果从类B中删除static关键字,则在不生成A实例的情况下,无法直接访问该关键字。

1
2
3
4
public class C {
    A a = new A();
    A.B ab = a. new B();
}

但是,我们不能让static成员进入non-static内部阶级。


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

答案是肯定的,我们可以在Java中使用静态类。在Java中,我们有静态实例变量以及静态方法,也有静态块。类也可以在Java中实现静态化。

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

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

1)嵌套静态类不需要引用外部类,但是非静态嵌套类或内部类需要外部类参考文献。

2)内部类(或非静态嵌套类)可以访问两个静态类以及外部类的非静态成员。静态类无法访问外部类的非静态成员。它只能访问静态外层阶级的成员。

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


鉴于这是谷歌上"静态类Java"的最高结果,最好的答案不在这里,我想我会添加它。我把OP的问题解释成关于C类中的静态类,这在Java世界中被称为单体。对于那些不知道的人,在C中,"static"关键字可以应用于类声明,这意味着结果类永远无法实例化。

摘自Joshua Bloch的"有效Java -第二版"(被广泛认为是最好的Java样式指南之一):

As of release 1.5, there is a third approach to implementing singletons. Simply make an enum type with one element:

1
2
3
4
5
// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

This approach is functionally equivalent to the public field approach, except that it is more concise, provides the serialization machinery for free , and provides an ironclad guarantee against multiple instantiation, even in the face of sophisticated serialization or reflection attacks. While this approach has yet to be widely adopted, a single-element enum type is the best way to implement a singleton. (emphasis author's)

布洛赫,约书亚(2008-05-08)。有效的Java(Java系列)(第18页)。皮尔逊教育。

我认为实现和理由都是不言而喻的。


外部类不能是静态的,但嵌套类/内部类可以是。这基本上可以帮助您在不创建外部类实例的情况下使用嵌套/内部类。


Java具有与类相关的静态方法(例如Java. Lang.Madio只有静态方法),但类本身不是静态的。