Java 中的静态类

java 中是否有类似static class东西?

这样的课是什么意思。静态类的所有方法是否也必须是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;
    }
}

好吧,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(); 
  }
}
public class A
{

 public static class B
 {
 }
}
B b = new B();
A a= new A();
B b = a.new B();
public class A {
    public static class B {

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

看到这是 Google 上 “静态类 java” 的最佳结果,最好的答案不在这里,我想我会添加它。我将 OP 的问题解释为涉及 C#中的静态类,在 Java 世界中这些静态类被称为单例。对于那些不知道的人,可以在 C#中将 “static” 关键字应用于类声明,这意味着永远无法实例化结果类。

摘自 Joshua Bloch 撰写的 “Effective Java-Second Edition”(被广泛认为是可用的最佳 Java 样式指南之一):

从版本 1.5 开始,存在第三种实现单例的方法。只需使用一个元素创建一个枚举类型:

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

此方法在功能上与公共领域方法等效,除了它更简洁,免费提供序列化机制之外,甚至在面对复杂的序列化或反射攻击时,也提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用,但是单元素枚举类型是实现单例的最佳方法。 (强调作者的)

约书亚 · 布洛赫(2008-05-08)。有效的 Java(Java 系列)(第 18 页)。培生教育。

我认为实施和辩解是不言而喻的。

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

答案是肯定的 ,我们可以在 java 中拥有静态类。在 Java 中,我们有静态实例变量静态方法静态块 。也可以在 Java 中将类设为静态。

在 Java 中,我们不能使顶级(外部)类静态化。 只有嵌套的类可以是静态的。

静态嵌套类与非静态嵌套类

1)嵌套的静态类不需要外部类的引用,但是非静态的嵌套类或内部类需要外部类的引用。

2)内部类(或非静态嵌套类)可以访问外部类的静态成员和非静态成员。静态类无法访问 Outer 类的非静态成员。它只能访问 Outer 类的静态成员。

参见此处: https : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html

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

简单来说,Java 支持仅将内部类声明为静态的类,而对于顶级类则声明为静态的。

顶级类:一个 Java 项目在每个 Java 源文件中可以包含多个顶级类,其中一个类以文件名命名。顶级类前面仅允许使用三个选项或关键字: public,abstract 和 final

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

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

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

我希望这可以为该问题提供一个更简单的解决方案,以便对 Java 的静态类有基本的了解。

public class OuterClass {

private static String name = "Mohammad";

// static nested class
static class StaticNestedClass {
    private int a;

    public int getA() {
        return this.a;
    }

    public String getName() {
        return name;
    }
  }
}
public class StaticNestedClassTest {

public static void main(String[] args) {

    //creating instance of static nested class
    OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();

    //accessing outer class static member
    System.out.println(nested.getName());    // Printing "Mohammad"
    }
}