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();
}
}
使 all 成为类的成员和函数 static - 由于无法实例化类,因此无法调用实例方法或访问实例字段
请注意,编译器不会阻止您声明实例(非静态)成员 . 只有在尝试调用实例成员时才会出现此问题
根据上述建议的简单示例:
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;
}
}
What good are static classes? 静态类的一个好用途是定义一次性,实用程序和/或库类,其中实例化没有意义 . 一个很好的例子是Math类,它包含一些数学常量,如PI和E,只是提供数学计算 . 在这种情况下要求实例化将是不必要和令人困惑的 . See Java's Math class . 请注意,它是最终的,并且其所有成员都是静态的 . 如果Java允许将顶级类声明为static,那么Math类确实是静态的 .
9 回答
有一个静态nested class,这个[静态嵌套]类不需要封闭类的实例,以便自己实例化 .
这些类[静态嵌套的]只能访问封闭类的静态成员[因为它没有对封闭类的实例的任何引用...]
代码示例:
Can a class be static in Java ?
答案是 YES ,我们可以在java中使用静态类 . 在java中,我们有静态实例变量以及静态方法和静态块 . 类也可以在Java中变为静态 .
在java中,我们不能使顶级(外部)类静态 . Only nested classes can be static.
static nested class vs non-static nested class
1)嵌套静态类不需要引用外部类,但非静态嵌套类或内部类需要外部类引用 .
2)内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员 . 静态类无法访问Outer类的非静态成员 . 它只能访问外部类的静态成员 .
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
当
class
中的成员被声明为static
时发生了什么?可以在不实例化class
的情况下访问该成员 . 因此,制作外部类(顶级类)static
没有任何意义 . 因此不允许这样做 .但是您可以将内部类设置为静态(因为它是顶级类的成员) . 然后可以在不实例化顶级类的情况下访问该类 . 请考虑以下示例 .
现在,在另一个类
C
中,可以在不创建类A
的实例的情况下访问类B
.static
类也可以有non-static
成员 . 只有这个类变得静态 .但是如果从类
B
中删除static
关键字,则在不创建A
实例的情况下无法直接访问它 .但是我们不能在
non-static
内部类中拥有static
成员 .外类不能是静态的,但嵌套/内部类可以是 . 这基本上可以帮助您使用嵌套/内部类而无需创建外部类的实例 .
Java有静态嵌套类,但听起来你正在寻找一个顶级静态类 . Java无法将顶级类设置为静态,但您可以像这样模拟静态类:
声明你的类
final
- 防止扩展类,因为扩展静态类是没有意义的使构造函数
private
- 防止客户端代码实例化,因为实例化静态类是没有意义的使 all 成为类的成员和函数
static
- 由于无法实例化类,因此无法调用实例方法或访问实例字段请注意,编译器不会阻止您声明实例(非静态)成员 . 只有在尝试调用实例成员时才会出现此问题
根据上述建议的简单示例:
What good are static classes? 静态类的一个好用途是定义一次性,实用程序和/或库类,其中实例化没有意义 . 一个很好的例子是Math类,它包含一些数学常量,如PI和E,只是提供数学计算 . 在这种情况下要求实例化将是不必要和令人困惑的 . See Java's Math class . 请注意,它是最终的,并且其所有成员都是静态的 . 如果Java允许将顶级类声明为static,那么Math类确实是静态的 .
看来这是谷歌“静态类java”的最佳结果,最好的答案不在这里,我想我会添加它 . 我将OP的问题解释为关于C#中的静态类,它们在Java世界中被称为单例 . 对于那些不知道的人,在C#中,“static”关键字可以应用于类声明,这意味着结果类永远不能被实例化 .
摘自Joshua Bloch的“Effective Java - Second Edition”(被广泛认为是最好的Java风格指南之一):
布洛赫,约书亚(2008-05-08) . 有效的Java(Java系列)(p.18) . 皮尔逊教育 .
我认为实施和理由是非常自我解释的 .
是的,java中有一个静态嵌套类 . 当你声明一个嵌套类静态时,它会自动成为一个独立的类,可以实例化它而不必实例化它所属的外部类 .
Example:
因为
class B
被声明为static,所以您可以显式实例化为:注意,如果
class B
wasn 't declared static to make it stand alone, an instance object call would' ve看起来像这样:好吧,Java有“静态嵌套类”,但它们与C#的静态类完全不同,如果那是你来自的地方 . 静态嵌套类只是一个不隐式引用外部类实例的类 .
静态嵌套类可以包含实例方法和静态方法 .
在Java中没有顶级静态类 .
Java具有与类关联的静态方法(例如,java.lang.Math只有静态方法),但类本身不是静态的 .