Java中的静态类

在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类,其中包含一些数学常量,如PI和E,并简单地提供数学计算。 在这种情况下要求实例化将是没有必要的和令人困惑的。 请参阅Java的Math类。 注意它是最终的,它的所有成员都是静态的。 如果Java允许顶级类声明为静态,那么Math类确实是静态的。


    那么,Java有“静态嵌套类”,但它们与C#的静态类并不完全相同,如果这就是你来自的地方。 静态嵌套类只是一个不隐含地引用外部类的实例的类。

    静态嵌套类可以有实例方法和静态方法。

    Java中没有像顶级静态类那样的东西。


    有一个静态嵌套类,这个[静态嵌套]类不需要包含类的实例来实例化它自己。

    这些类[static nested ones]只能访问封闭类的静态成员[因为它没有任何引用封闭类的实例...]

    代码示例:

    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(); 
      }
    }
    
    链接地址: http://www.djcxy.com/p/13281.html

    上一篇: Static Classes In Java

    下一篇: Why are static variables considered evil?