首页 文章

Java中的静态类

提问于
浏览
810

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

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

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

什么是静态类有用?

9 回答

  • 88

    有一个静态nested class,这个[静态嵌套]类不需要封闭类的实例,以便自己实例化 .

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

    代码示例:

    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(); 
      }
    }
    
  • 136

    Can a class be static in Java ?

    答案是 YES ,我们可以在java中使用静态类 . 在java中,我们有静态实例变量以及静态方法和静态块 . 类也可以在Java中变为静态 .

    在java中,我们不能使顶级(外部)类静态 . Only nested classes can be static.

    static nested class vs non-static nested class

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

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

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

  • 289

    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 成员 . 只有这个类变得静态 .

    但是如果从类 B 中删除 static 关键字,则在不创建 A 实例的情况下无法直接访问它 .

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

    但是我们不能在 non-static 内部类中拥有 static 成员 .

  • 29

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

  • 1

    Java有静态嵌套类,但听起来你正在寻找一个顶级静态类 . Java无法将顶级类设置为静态,但您可以像这样模拟静态类:

    • 声明你的类 final - 防止扩展类,因为扩展静态类是没有意义的

    • 使构造函数 private - 防止客户端代码实例化,因为实例化静态类是没有意义的

    • 使 all 成为类的成员和函数 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;
        }
    }
    

    What good are static classes? 静态类的一个好用途是定义一次性,实用程序和/或库类,其中实例化没有意义 . 一个很好的例子是Math类,它包含一些数学常量,如PI和E,只是提供数学计算 . 在这种情况下要求实例化将是不必要和令人困惑的 . See Java's Math class . 请注意,它是最终的,并且其所有成员都是静态的 . 如果Java允许将顶级类声明为static,那么Math类确实是静态的 .

  • 11

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

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

    从1.5版开始,实现单例的第三种方法 . 只需使用一个元素创建一个枚举类型:// Enum singleton - 首选方法
    public enum Elvis {
    实例;
    public void leaveTheBuilding()

    }
    这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多个实例化的铁定保证,即使面对复杂的序列化或反射攻击 . 虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法 . (重点笔者的)

    布洛赫,约书亚(2008-05-08) . 有效的Java(Java系列)(p.18) . 皮尔逊教育 .

    我认为实施和理由是非常自我解释的 .

  • 745

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

    Example:

    public class A
    {
    
     public static class B
     {
     }
    }
    

    因为 class B 被声明为static,所以您可以显式实例化为:

    B b = new B();
    

    注意,如果 class B wasn 't declared static to make it stand alone, an instance object call would' ve看起来像这样:

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

    好吧,Java有“静态嵌套类”,但它们与C#的静态类完全不同,如果那是你来自的地方 . 静态嵌套类只是一个不隐式引用外部类实例的类 .

    静态嵌套类可以包含实例方法和静态方法 .

    在Java中没有顶级静态类 .

  • 9

    Java具有与类关联的静态方法(例如,java.lang.Math只有静态方法),但类本身不是静态的 .

相关问题