java中有静态类吗?
这样的课有什么意义。静态类的所有方法也需要是静态的吗?
是否反过来要求,如果一个类包含所有静态方法,那么这个类也应该是静态的?
静态类有什么好处?
java中有静态类吗?
这样的课有什么意义。静态类的所有方法也需要是静态的吗?
是否反过来要求,如果一个类包含所有静态方法,那么这个类也应该是静态的?
静态类有什么好处?
当前回答
当类中的成员被声明为静态时会发生什么?可以在不实例化类的情况下访问成员。因此,使外部类(顶级类)静态是没有意义的。因此这是不允许的。
但是你可以将内部类设置为静态的(因为它是顶级类的成员)。然后可以在不实例化顶级类的情况下访问该类。考虑下面的例子。
public class A {
public static class B {
}
}
现在,在不同的类C中,类B可以在不创建类a实例的情况下被访问。
public class C {
A.B ab = new A.B();
}
静态类也可以有非静态成员。只有类是静态的。
但是如果static关键字从类B中删除,则在不创建A的实例的情况下不能直接访问它。
public class C {
A a = new A();
A.B ab = a. new B();
}
但是在非静态内部类中不能有静态成员。
其他回答
都是很好的答案,但是我没有看到java.util.Collections的引用,它为它们的静态因子方法使用了大量的静态内部类。加上相同的。
从java.util.Collections中添加一个示例,其中有多个静态内部类。内部类对于需要通过外部类访问的代码进行分组非常有用。
/**
* @serial include
*/
static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
implements Set<E>, Serializable {
private static final long serialVersionUID = -9215047833775013803L;
UnmodifiableSet(Set<? extends E> s) {super(s);}
public boolean equals(Object o) {return o == this || c.equals(o);}
public int hashCode() {return c.hashCode();}
}
下面是java.util.Collections类中的静态因子方法
public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
return new UnmodifiableSet<>(s);
}
外部类不能是静态的,但嵌套/内部类可以。这基本上可以帮助您使用嵌套/内部类,而无需创建外部类的实例。
是的,在java中有一个静态嵌套类。 当你声明一个嵌套类静态时,它自动成为一个独立的类,可以实例化,而不必实例化它所属的外部类。
例子:
public class A
{
public static class B
{
}
}
因为类B被声明为静态的,你可以显式实例化为:
B b = new B();
注意,如果类B没有被声明为静态以使其独立,实例对象调用将看起来像这样:
A a= new A();
B b = a.new B();
好吧,Java有“静态嵌套类”,但它们与c#的静态类完全不一样,如果你是从那里来的的话。静态嵌套类只是一个没有隐式引用外部类实例的类。
静态嵌套类可以有实例方法和静态方法。
在Java中没有顶级静态类这种东西。
Java有静态嵌套类,但听起来像是在寻找顶级静态类。Java没有办法让顶级类成为静态的,但是你可以像这样模拟一个静态类:
Declare your class final - Prevents extension of the class since extending a static class makes no sense Make the constructor private - Prevents instantiation by client code as it makes no sense to instantiate a static class Make all the members and functions of the class static - Since the class cannot be instantiated no instance methods can be called or instance fields accessed Note that the compiler will not prevent you from declaring an instance (non-static) member. The issue will only show up if you attempt to call the instance member
以上建议的简单例子:
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? A good use of a static class is in defining one-off, utility and/or library classes where instantiation would not make sense. A great example is the Math class that contains some mathematical constants such as PI and E and simply provides mathematical calculations. Requiring instantiation in such a case would be unnecessary and confusing. See the Math class and source code. Notice that it is final and all of its members are static. If Java allowed top-level classes to be declared static then the Math class would indeed be static.