【问题标题】:Instantiating multiple instances of a class from within [duplicate]从[重复]内部实例化一个类的多个实例
【发布时间】:2020-01-01 00:12:54
【问题描述】:

谁能解释一下下面的代码是如何工作的,没有任何例外。我在想,当为 SUNDAY 创建新实例时,它也会为 MONDAY(在 SUNDAY 内)创建一个新实例,然后再为 SUNDAY(在 MONDAY 内)创建一个新实例,依此类推......类似于递归,因为它们都是类 Week 的一部分。但我的理解是错误的,因为下面的代码工作正常。

public class Week {
    public static final Week SUNDAY = new Week("SUNDAY",0);
    public static final Week MONDAY = new Week("MONDAY",1);

    private String name;
    private int val;

    private Week(String name, int val) {
        this.name = name;
        this.val = val;
    }

    public int getIndex() {
        return this.val;
    }

    @Override
    public String toString() {
        return this.name;
    }
}

我在阅读 Java 枚举时产生了这个疑问。

【问题讨论】:

    标签: java enums


    【解决方案1】:

    当SUNDAY 和MONDAY 是实例变量(非静态)时,您将看到上述行为。

    由于您已将它们声明为静态,因此这些是类的属性,并在 Week 类一个接一个加载时初始化。一个对象创建SUNDAY 不会包含MONDAY,反之亦然。

    正如我在开头提到的,下面的代码不会成功运行,因为它会尝试递归地创建实例而没有结束。

    public class Week {
    
        public final Week SUNDAY = new Week("SUNDAY",0);
        public final Week MONDAY = new Week("MONDAY",1);
    
        private String name;
        private int val;
    
        private Week(String name, int val) {
            this.name = name;
            this.val = val;
        }
    
        public int getIndex() {
            return this.val;
        }
    
        @Override
        public String toString() {
            return this.name;
        }
    
        public static void main(String[] args) {
            new Week("TUESDAY", 2);
        }
    }
    

    【讨论】:

    • System.out.println(Week.SUNDAY.MONDAY) 工作正常,因为可以通过 ClassName.staticVariable 或 classInstance.staticVariable 访问类变量?
    • 是的,当声明为static 时,这些class 变量可以作为Class.variable 或instance.variable 访问(没有区别)。但是,您应该以Class.variable 的形式访问static 变量。
    • 明白谢谢:)
    【解决方案2】:

    SUNDAY 和 MONDAY 是 static 变量。这意味着它们是类变量。 Week 类的对象将没有名为 SUNDAY 和 MONDAY 的属性

    您可以在此处获取有关static 的更多信息:What does the 'static' keyword do in a class?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2012-09-10
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多