可以在Class的底部声明实例变量吗?

Can Instance variables be declared at the bottom of the Class?

当我在站点 java_variable_types

中看到 "Instance variables can be declared in class level before or after use." 时,我有一个问题

我不明白class级别是什么,这个序列是什么意思。

实例变量 val 在第 #2 行中声明(请注意标记)但甚至在第 #1 行之前引用。您可以从第 3 行和第 2 行中删除注释。然后它也会起作用。

这意味着变量 val 在声明之前在第 1 行中使用,以防万一第 2 行考虑在第 3 行之后使用。

public class prog{
     //private  int val; //line# 3
      public  int getVal()
       { 
          return val;//line# 1
       }
        private  int val; //line# 2
        prog()
        {
           val=0;
        }
        public static void main( String [] args)
        {
            prog obj= new prog();
            System.out.println("val:"+obj.getVal());
        }
    }

虽然您的参考资料很好地解释了它,但为了完整性,我将添加一些细节。


实例变量...

  • 在 class 级别 声明
  • 可以有任何必要的可见性(publicprotectedprivate,或者没有修饰符来表示包私有)
  • 将在实例化后收到一个 initial value(也就是说,您 没有 用值实例化该字段...但是如果您不这样做实例化一个参考值,你可以运行变成NullPointerException)

短语"before or after use"没有多大意义,但让我们来说明一个场景:

public class Foo {
    private String word;

    public void printTheWord() {
        System.out.println(word);
    }
}

word 还没有被实例化,但是我们可以使用它,因为它收到了 null 的初始值。这意味着我们不会得到我们想要的值,但它编译。

将其与局部变量进行对比。以下代码无法编译,因为 word 尚未实例化。

public class Foo {
    public void printTheWord() {
        String word;
        System.out.println(word);
    }
}

我认为他们的意思是这是合法的:

 public class Test {
    private int someValue;

    public int myMethod() {
        return someValue + anotherValue;
    }

    private int anotherValue;
 }

(确实如此!)

但是,我认为网站将其描述为 是错误的。 ].

  1. 短语 "declared in class level" 是错误的英语语法。

  2. 短语 "in class level" 有歧义。它可能意味着在 class 的正文中声明。但是,它也可以表示声明为 "class-level"(即 static)变量。 (这是矛盾的,也是不正确的,但是...)

  3. 短语 "before or after use" 有歧义。它可能意味着源代码文件中的之前或之后。在时间意义上,它也可能意味着之前或之后。 (那是不正确的。在运行时,对象的所有实例变量都在方法或构造函数主体中的代码执行之前声明和初始化。)


虽然他们在那句话中试图说的(我认为)是正确的,但他们表达得很糟糕,这显然让一些读者感到困惑。

短语"before or after use."表示实例变量适用于整个class,不像局部变量仅在该方法内部受到限制。

可以在class的开头声明或初始化,这一般是最有可能的方式。 其他,在class内部,可以在使用它的方法调用后声明。

请找到下面的代码片段来理解短语:

public class InstanceVariable {

    //declared before
    int foo=4;
    public void testInstanceVariableUse(){
        System.out.println("The total value of the instance variable is "+ (foo+boo));
    }
    //declared after        
    int boo=5;
}


class TestInstanceVariable{
    public static void main(String[] args){
        InstanceVariable instanceVar = new InstanceVariable();
        instanceVar.testInstanceVariableUse();
    }
}

输出: 实例变量的总值为9