【问题标题】:Can Instance variables be declared at the bottom of the Class?实例变量可以在类的底部声明吗?
【发布时间】:2015-09-20 01:38:10
【问题描述】:

当我看到“实例变量可以在使用之前或之后在类级别声明。”时有一个问题。在网站java_variable_types

我不明白什么是类级别以及这个序列的含义。

【问题讨论】:

  • 有趣的是,TutorialsPoint 仍然没有解决这个繁琐的文本,距离它在这里首次被提及已经过去了 5 年多。得出你自己的结论:-)

标签: java variables instance


【解决方案1】:

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

 public class Test {
    private int someValue;

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

    private int anotherValue;
 }

(确实如此!)

但是,我认为网站将其描述为“[i]实例变量可以在使用之前或之后在类级别声明”是错误的。

  1. “declared in class level”这句话是不好的英语语法。

  2. “在班级级别”这个短语是模棱两可的。这可能意味着在类的主体中声明。但是,它也可能意味着声明为“类级别”(即static)变量。 (这是矛盾的,也是不正确的,但是……)

  3. “使用前或使用后”这句话不明确。它可能意味着源代码文件中的之前或之后。它也可能意味着在时间意义上的之前或之后。 (那是不正确的。在运行时,对象的所有实例变量都在方法或构造函数体中的代码执行之前被声明和初始化。)


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

【讨论】:

  • 这是合法的,但如果我的团队中有人这样做,我仍然会报警。
【解决方案2】:

实例变量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());
        }
    }

【讨论】:

    【解决方案3】:

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


    一个实例变量...

    • 在类级别声明
    • 可以有任何必要的可见性(publicprotectedprivate,或者没有修饰符来表示包私有)
    • 将在实例化后收到initial value(也就是说,您没有用值实例化该字段...但如果您不实例化引用值,您可以遇到NullPointerException)

    “使用前或使用后”这句话没有多大意义,但让我们举例说明一下:

    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);
        }
    }
    

    【讨论】:

      【解决方案4】:

      短语“使用前或使用后”。这意味着实例变量适用于整个类,而不像局部变量仅在该方法内部受到限制。

      它可以在类的开始处声明或初始化,这通常是最可能的方式。 其他,在类内部,可以在使用它的方法调用后声明。

      请看下面的代码 sn-p 来理解这个短语:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多