Java中是否存在类似于static class
的东西?
这样的类是什么意思?静态类的所有方法都需要是static
吗?
反过来也一样吗?如果一个类只包含静态方法,那么该类也必须是静态的吗?
静态类有什么好处?
Java中是否存在类似于static class
的东西?
这样的类是什么意思?静态类的所有方法都需要是static
吗?
反过来也一样吗?如果一个类只包含静态方法,那么该类也必须是静态的吗?
静态类有什么好处?
Java有静态的嵌套类,但是听起来你正在寻找一个顶层的静态类。Java没有办法让顶层类成为静态的,但是你可以通过以下方式模拟一个静态类:
final
- 防止类被扩展,因为扩展一个静态类没有意义private
- 防止客户端代码实例化该类,因为实例化一个静态类没有意义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;
}
}
静态类有什么用处? 静态类的一个很好的用途是定义一次性、实用和/或库类,其中实例化是没有意义的。一个很好的例子是数学类(Math class),它包含一些数学常量,如π和E,并提供数学计算。在这种情况下需要实例化是不必要而且令人困惑的。请参见Math
类和源代码。请注意,它是final
的,其所有成员都是static
的。如果Java允许顶层类声明为static
,那么Math类确实将是静态的。
Foo
类与静态类Foo
不同。 - craigbJava有“静态嵌套类”,但它们与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();
请注意,如果未将B类
声明为静态使其独立存在,则实例对象调用将如下所示:
A a= new A();
B b = a.new B();
B b = new B();
。 - Muhammed Refaat当一个类内的成员被声明为 static
时会发生什么?这意味着可以在不实例化该类的情况下访问该成员。因此,将外部类(顶级类)声明为 static
没有意义,因此是不允许的。
但是可以将内部类设置为静态(因为它是顶级类的成员)。然后,可以在不实例化顶级类的情况下访问该类。考虑以下示例:
public class A {
public static class B {
}
}
现在,在另一个类C
内部,可以访问类A
的实例而无需创建一个实例。
public class C {
A.B ab = new A.B();
}
static
类也可以有非静态
成员,只有类本身是静态的。
但是如果从类B
中删除static
关键字,则不能直接访问它,除非创建A
的实例。
public class C {
A a = new A();
A.B ab = a. new B();
}
但是我们不能在一个非静态内部类中拥有static
成员。
static
只有一个含义。如果一个类中的某个元素是static
,那么这个元素可以在不创建该类实例的情况下访问。这并不涉及到是否创建实例的问题。 - Ramesh-XJava中的类可以是静态的吗?
答案是可以的,在Java中我们可以有静态类。在Java中,我们有静态实例变量、静态方法以及静态块。类也可以在Java中被定义为静态。
在Java中,我们不能将顶级(外部)类设为静态。只有嵌套类可以是静态的。
静态嵌套类与非静态嵌套类
1) 静态嵌套类不需要引用外部类,但是非静态嵌套类或内部类需要对外部类进行引用。
2) 内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员。一个静态类不能访问外部类的非静态成员,它只能访问外部类的静态成员。
请参见:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
鉴于这是谷歌上“静态类java”的最高搜索结果,而最佳答案并不在此,所以我认为我应该添加一些内容。我理解OP的问题指的是C#中的静态类,在Java世界中被称为单例模式。对于那些不知道的人来说,在C#中,“static”关键字可以应用于类声明,这意味着生成的类永远无法实例化。
Josha Bloch的《Effective Java - 第二版》(被广泛认为是最好的Java样式指南之一)中的摘录:
从1.5版本开始,有第三种实现单例模式的方法。只需创建一个元素的枚举类型:
// Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }
这种方法在功能上与公共字段方法等价,只是更加简洁,提供了免费的序列化机制,并提供了一个坚不可摧的保证,即使面对复杂的序列化或反射攻击也不会多次实例化。虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。(作者强调)
外部类不能是静态的,但嵌套/内部类可以是静态的。这基本上帮助您在不创建外部类实例的情况下使用嵌套/内部类。
除非是内部类,否则不能在类中使用static关键字。静态内部类是外部类的静态成员的嵌套类。它可以在不实例化外部类的情况下访问,使用其他静态成员。就像静态成员一样,静态嵌套类没有访问外部类的实例变量和方法的权限。
public class Outer {
static class Nested_Demo {
public void my_method() {
System.out.println("This is my nested class");
}
}
public static void main(String args[]) {
Outer.Nested_Demo nested = new Outer.Nested_Demo();
nested.my_method();
}
}