【问题标题】:initializing values to constructor初始化构造函数的值
【发布时间】:2017-02-16 11:52:52
【问题描述】:

在下面的代码中,我声明了 2 个用户定义的构造函数,一个没有参数,另一个有 3 个参数,在这两个构造函数中,我都为实例变量赋值,当执行 main 方法时,构造函数的输出没有参数为 2,第一种方式中具有 3 个参数的构造函数的 o/p 为 0,但是当我尝试第二种方式时,零参数构造函数的 o/p 为 2,3 参数构造函数的 o/p 为 15,我正在传递创建对象时的参数,现在我不明白为什么第一种方式输出为零。

public class Main {

    int x, y, z;

    Main() {
        x = 2;
        y = 2;
        z = 2;
    }

    // first way
    Main(int x, int y , int z) {
        x = 20;
        y = 20;
        z = 10;
    }

    // second way
    Main(int x, int y , int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int sub() {
        int m;
        m = x + y - z;
        System.out.println("the value is " + m);
        return m;
    }
}

以下是主要方法:

package demo;

public class Maintest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main s = new Main();
        int s1 = s.sub();
        Main s3 = new Main(10,10,5);
        int s2 = s3.sub();
        System.out.println(s1);
        System.out.println(s2);
    }
}

【问题讨论】:

    标签: java variables constructor instance


    【解决方案1】:

    当您使用x=20 时,您正在为传递给构造函数的参数x 分配一个新值,而不是将该值分配给实例成员。当你写this.x时,它显然绑定到实例成员。

    如果您仍然对它们感到困惑,请将参数名称更改为其他名称并检查。

    【讨论】:

    • Main(int a, int b, int c){ a = 20; b = 20; c = 10;这个.x=a;这个.y=b;这个.z=c; }
    • 我做了这个改变,但我无法得到它发生了什么请你详细说明,因为我正在为构造函数的参数赋值,那么 o/p 应该是 15 而不是0
    • 当你刚刚做Main(int a, int b , int c){ a = 20; b = 20; c = 10;的时候,那里有x的参与吗?没有权利 ?因此值为零
    • Main(int a, int b, int c){ a = 20; b = 20; c = 10;这个.x=a;这个.y=b;这个.z=c; } 根据此更改,o/p 很好,它显示 30 @SureshAtta
    • @VinayPBhosale 最后,您正在分配值。 this.x=a; this.y=b; this.z=c;
    【解决方案2】:

    this 指的是调用该方法的当前对象引用。所以在变量引用当前对象实例变量之前使用this

    如果您不使用this,那么它们将指向参数中传递的变量。

    但是,如果您更改了函数参数名称,然后只使用x,它将引用当前对象实例变量。

    【讨论】:

      【解决方案3】:

      如果实例变量名与参数名相似,此时显式使用'this'来解决JVM的歧义问题。

      Main(int x, int y, int z) {
          this.x = x;
          this.y = y;
          this.z = z;
      }
      

      这是标准做法。

      但是,如果您更改参数名称,则不必使用“this”。

      Main(int xx, int yy, int zz) {
          x = 20;
          y = 20;
          z = 10;
      }
      

      这里指的是实例变量,会给你正确的结果。

      干杯!!!

      【讨论】:

      • 现在我明白了变量 x=20 的范围在该构造函数中,我的方法无法访问该变量,所以这就是我将 o/p 设为零的原因
      【解决方案4】:

      我看到了你的代码。当您以 //first 方式使用构造函数时

      您得到的答案是 0,因为您分别初始化为变量 x,y,z 的值 20、20、10 被初始化为构造函数变量 x,y,z 而不是类变量 x,y,z。

      当你使用构造函数时 //第二种方式

      由于使用了“this”关键字,值被初始化为类变量 x,y,z。 this 指的是类变量,因此当您在第二种方式中使用构造函数时,结果显示为 15。

      【讨论】:

      • 现在我明白了变量 x=20 的范围在该构造函数中,我的方法无法访问该变量,所以这就是我将 o/p 设为零的原因
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多