【问题标题】:Java initial values?Java 初始值?
【发布时间】:2013-05-26 18:04:25
【问题描述】:

如果我要这样做:

public class Game
{
    private boolean RUNNING = true;

    Game()
    {
    }

    public static void main(String[] args)
    {
        Game game = new Game();
    }
}

RUNNING = true会在什么时间点?

编辑:为清楚起见,将在程序运行的哪个点设置为 true。例如:构造函数之前,构造函数之后等。

【问题讨论】:

  • 一直?...
  • 这是个好问题。当你创建一个对象时,事物的初始化有一定的顺序。这不仅仅是“一直”,对不起。
  • 这就是我要问的。我的意思是顺序。
  • @Lemmons 在这种情况下,我会更新问题以反映排序等,否则,从标题中不清楚。
  • @ThomasUhrig:使用更全面的示例代码(例如,有多个要初始化的成员、静态初始化器等),这可能是一个好问题;)

标签: java class constructor


【解决方案1】:

在构造函数之前会被设置为true。你可以在构造函数中使用true

【讨论】:

    【解决方案2】:

    这段代码解释了自己:

    public class SuperClass
    {
        String superField = getString("superField");
    
        public SuperClass()
        {
            System.out.println("SuperClass()");
        }
    
        public static String getString(String fieldName)
        {
            System.out.println(fieldName + " is set");
            return "";
        }
    
        public static void main(String[] args)
        {
            new ChildClass();
        }
    }
    
    class ChildClass extends SuperClass
    {
        String childField = getString("childField");
    
        public ChildClass()
        {
            System.out.println("ChildClass()");
        }
    }
    

    输出:

    superField is set
    SuperClass()
    childField is set
    ChildClass()
    

    【讨论】:

      【解决方案3】:

      当使用new 运算符调用构造函数时,类的所有非静态成员都会在构造函数内部的代码执行之前初始化。您可以使用调试器并单步执行该调用,看看它先去哪里。静态成员在加载类和第一次访问时初始化(有关静态成员的更多详细信息,请参阅question)。

      【讨论】:

        【解决方案4】:
        private boolean RUNNING = true;
        Game() {
        }
        

        完全一样

        private boolean RUNNING;
        Game() {
            RUNNING = true;
        }
        

        实际上,编译器会将初始化移动到构造函数的开头。然后在实例化该类的对象时设置该值。

        【讨论】:

          【解决方案5】:

          当你尝试使用未手动初始化的局部变量时,你会得到一个编译时错误。

          public static void main(String args[]){
                         int a;
                        System.out.pritnln(a); //error
                }
          

          但实例变量并非如此。这本身就表明它们甚至在构造函数之前就可以使用了。

             public class Example{
                      private int a;
                      public Example(){
                             System.out.println(a);   //No error
                      }
                      public int getA(){
                             return a;           //No error
                      }
             }
          

          我希望这种直觉能回答你的问题............

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-12
            • 2013-10-08
            • 1970-01-01
            • 2011-11-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多