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,并且只提供数学计算。在这种情况下,需要实例化是不必要的,而且很混乱。参见
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 { } } |
因为
1 | B b = new B(); |
注意:如果
1 2 | A a= new A(); B b = a.new B(); |
当
但是您可以将内部类设置为静态的(因为它是顶级类的成员)。然后可以在不实例化顶级类的情况下访问该类。考虑下面的例子。
1 2 3 4 5 | public class A { public static class B { } } |
现在,在一个不同的类
1 2 3 | public class C { A.B ab = new A.B(); } |
但是,如果从类
1 2 3 4 | public class C { A a = new A(); A.B ab = a. new B(); } |
但是,我们不能让
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只有静态方法),但类本身不是静态的。