【问题标题】:why am i getting zero while i have initialized my instance variables?为什么我在初始化实例变量时变为零?
【发布时间】:2014-10-06 14:22:08
【问题描述】:

我在下面有一个简单的 java 程序。我已经声明了实例整数变量“x1”和“x2”,从我的类构造函数中的参数初始化它们。 我还声明了一个整数变量“diff”,它计算出“x1”和“x2”之间的差异,但变量返回零!我不知道问题出在哪里,我的构造函数参数不为零!!!。我将不胜感激任何帮助

public class Smallest {
int x1;
int x2; 

public Smallest(int a,int b){
 this.x1=a;
 this.x2=b;
}

int diff = x2 - x1;   
public void draw(){
    System.out.println("X1= "+ x1 +"\n X2= "+ x2 +"\n diff= " +diff);
}

public static void main(String[] args) {
Smallest small=new Smallest(10,20);
small.draw();
}
}

这是输出

 X1= 10;
 X2= 20;
 diff= 0;

【问题讨论】:

  • 因为diff在调用构造函数之前被初始化,结果为x2 - x1,即0。
  • 所以你的意思是如果实例变量在创建过程中没有被初始化,它们就会被初始化为默认值?我的意思是,它们是在构造函数之前执行的吗?我以为java编译器会按照默认的顺序执行?
  • 是的,它们在构造函数被调用之前被初始化。
  • 这真的很棘手。更糟糕的是,它不是语法错误或编译时错误

标签: java class variables constructor


【解决方案1】:

这是因为 diff 不在它在编译时设置的任何方法中。您应该将其移动到构造函数或任何其他方法以获得正确的值。
示例:

int diff;
public Smallest(int a,int b){
   this.x1=a;
   this.x2=b;
   this.diff=x2 - x1;   
}

【讨论】:

    【解决方案2】:

    int diff = x2 - x1; 应该在 constructor 或方法 draw() 内(取决于你想用它做什么)。

    记住:默认情况下int变量初始化为0。在你调用构造函数之前:

    x1=0; 
    x2=0; 
    diff=x1-x2
        =0-0
        =0
    

    当您调用构造函数时,您为 x1 和 x2 提供不同的值,但您不会根据新更新的值计算 diff。

    调用构造函数后:

    x1=10;
    x2=20;
    diff=0; // you don't recalculate it, it's not in the constructor or in the draw method.
    

    【讨论】:

    • 但是我已经初始化了我的 x1 和 x2?请向我解释清楚发生了什么让我得到零!
    • @gikarasojo kinene 当您调用构造函数时,您只初始化 x1 和 x2。初始化它们后,您永远不会将 diff 设置为 x1-x2。为此,您必须选择:在构造函数中计算差异(在这种情况下,差异变量必须是实例变量,如 x1 和 x2)或在您调用的方法 draw() 中计算差异。
    • @gikarasojo kinene 看看现在是否清楚,我更新了答案。
    • 这意味着对实例变量的任何操作都应该在方法或构造函数中完成?如果我在声明期间直接初始化 x1 和 x2 而不通过构造函数并在 main 方法中调用 diff,我还会得到零吗?
    • 没有。如果您从一开始就将它们初始化为 10 和 20,您会看到 diff=10
    【解决方案3】:

    成员变量在调用构造函数之前被初始化。因此 diff 等于 0 - 0,因为 x1 和 x2 尚未设置。

    【讨论】:

    • 我认为 java 编译器会按照顺序执行,就像我安排代码的方式一样?也就是说,它会在做减法之前初始化 x1 和 x2
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多