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只有静态方法),但类本身不是静态的。