Java中的静态类

java中有类似static class的东西吗?

这样的课有什么意义。静态类的所有方法也需要是static吗?

是否反过来要求,如果一个类包含所有静态方法,那么这个类也应该是静态的?

静态类有什么好处?

1045617 次浏览

好吧,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有与类相关联的静态方法(例如Java .lang. math只有静态方法),但是类本身不是静态的。

外部类不能是静态的,但嵌套/内部类可以。这基本上可以帮助您使用嵌套/内部类,而无需创建外部类的实例。

是的,在java中有一个静态嵌套类。当你声明一个嵌套类静态时,它自动成为一个独立的类,可以被实例化,而不必实例化它所属的外部类

例子:

public class A{
public static class B{}}

因为class B被声明为静态的,你可以显式地实例化为:

B b = new B();

注意,如果class B没有被声明为static以使其独立,实例对象调用将看起来像这样:

A a= new A();B b = a.new B();

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 behaviorpublic final class MyStaticClass {private MyStaticClass () { // private constructormyStaticMember = 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类,它包含一些数学常数,如PI和E,并简单地提供数学计算。在这种情况下要求实例化将是不必要的和令人困惑的。请看# 0类和源代码类。注意,它是final,它的所有成员都是static。如果Java允许顶级类声明为static,那么Math类确实是静态的。

鉴于这是谷歌上“静态类java”的最高结果,最好的答案不在这里,我想我应该添加它。我将OP的问题解释为c#中的静态类,这些类在Java世界中被称为单例。对于那些不知道的人,在c#中“static”关键字可以应用于类声明,这意味着生成的类永远不能被实例化。

摘自Joshua Bloch的“Effective Java - Second Edition”(被广泛认为是最好的Java风格指南之一):

从1.5版开始,有第三种实现单例对象的方法。简单地创建一个只有一个元素的枚举类型:

// Enum singleton - the preferred approachpublic enum Elvis {INSTANCE;public void leaveTheBuilding() { ... }}

这种方法在功能上与公共字段方法相同,只是它更简洁,免费提供序列化机制,并提供了防止多重实例化的铁证,即使在面对复杂的序列化或反射攻击时也是如此。虽然这种方法还没有被广泛采用,但单元素枚举类型是实现单元素的最佳方式。(强调作者)

约书亚•布洛赫(2008-05-08)。Effective Java (Java系列)(第18页)。培生教育。

我认为实现和证明是不言自明的。

class中的成员被声明为static..时会发生什么?可以在不实例化class的情况下访问成员。因此,将外层类(顶级类)设为static没有任何意义。因此这是不允许的。

但是你可以将内部类设置为静态的(因为它是顶级类的成员)。然后可以在不实例化顶级类的情况下访问该类。考虑下面的例子。

public class A {public static class B {
}}

现在,在不同的类C中,可以在不创建类A实例的情况下访问类B

public class C {A.B ab = new A.B();}

static类也可以有non-static成员。只有类是静态的。

但是如果static关键字从类B中删除,则不能直接访问它,除非创建A的实例。

public class C {A a = new A();A.B ab = a. new B();}

但是在non-static内部类中不能有static成员。

Java中的类可以是静态的吗?

答案是0,我们可以在java中有静态类。在java中,我们有静态实例变量静态方法静态块。在Java中,类也可以是静态的。

在java中,我们不能使顶级(外部)类是静态的。# 0

静态嵌套类vs非静态嵌套类

1)嵌套静态类不需要外部类的引用,但是非静态嵌套类或内部类需要外部类参考。< / p > 内部类(或非静态嵌套类)可以访问静态和Outer类的非静态成员。静态类不能访问Outer类的非静态成员。它只能访问静态

看这里:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

简单地说,Java只支持将一个类声明为内部类的静态,而不支持将顶级类声明为静态。

一个java项目可以在每个java源文件中包含多个顶级类,其中一个类以文件名命名。在顶级类公开的,抽象的,最终的前面只允许有三个选项或关键字。

在顶级类内部的< em >内部类:< / em >类称为内部类,这基本上是嵌套类的概念。# 1。使内部类静态的想法是利用实例化内部类的对象而不实例化顶层类的对象的优势。这与顶级类中的静态方法和变量的工作方式完全相同。

因此Java支持内部类级别的静态类(在嵌套类中)

Java不支持顶级类的静态类。

我希望这可以为基本理解Java中的静态类提供一个更简单的解决方案。

除非是内部类,否则不能对类使用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();}}

静态方法意味着可以在不创建类对象的情况下访问它,这与public方法不同:

public class MyClass {// Static methodstatic void myStaticMethod() {System.out.println("Static methods can be called without creating objects");}
// Public methodpublic void myPublicMethod() {System.out.println("Public methods must be called by creating objects");}
// Main methodpublic static void main(String[ ] args) {myStaticMethod(); // Call the static method// myPublicMethod(); This would output an error
MyClass myObj = new MyClass(); // Create an object of MyClassmyObj.myPublicMethod(); // Call the public method}}

都是很好的答案,但是我没有看到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 final class ClassSingleton {
private static ClassSingleton INSTANCE;private String info = "Initial info class";
private ClassSingleton() {}
public static ClassSingleton getInstance() {if(INSTANCE == null) {INSTANCE = new ClassSingleton();}    
return INSTANCE;}
// getters and setters
public String getInfo(){return info;}}

用法是这样的:

String infoFromSingleton = ClassSingleton.getInstance().getInfo()

单例非常适合存储数组列表/列表/集合类等…如果您经常从多个区域收集、更新、复制集合,并且需要这些集合保持同步。或者多对一。