【问题标题】:Confusion in Constructor in javajava中构造函数的困惑
【发布时间】:2015-03-19 09:17:00
【问题描述】:

当尝试通过将参数名称保留为实例变量名称来从构造函数初始化实例变量时。我收到的输出为 0. 而不是传递的值。请解释一下?

public class Circle
    {
         int x;
        int y;
        int radius;

    //Constructor with same parameters of field name

    public Circle(int x,int y,int radius)
    {
        x=x;
        y=y;
        radius=radius;
    }
    //Overridden to String()

    public String toString()
    {
        return "center("+x+" , "+y+") and radius ("+radius+")";
    }

    //Main method 

    public static void main(String[] args) 
    {
        System.out.println(new Circle(5,5,50));
    }


    }

当我将值从构造函数 5、5、50 传递给构造函数的参数时。他们不应该显示相同的值吗?

System.out.println(new Circle(5,5,50)); // 发送给构造函数的值

public Circle(int x,int y,int radius) //构造函数参数取值

【问题讨论】:

  • 您目前认为x=x; 做了什么?
  • 改成this.x = x

标签: java


【解决方案1】:

您需要使用this.x = x等。

x 作为参数传递遮蔽该字段。发生这种情况时,您可以使用this.x 来表示该字段。

【讨论】:

  • 好的。但在那种情况下,当我向构造函数参数发送值时,x=5,y=5,radius=50。现在在我尝试设置值时在构造函数中。不应该将值设置为。 x=5,y=5,半径=50。抱歉夸大了,但我需要知道。感谢您的帮助。
【解决方案2】:

构造函数的参数隐藏了你的类的成员。

将您的构造函数更改为:

public Circle(int x,int y,int radius)
{
    this.x=x;
    this.y=y;
    this.radius=radius;
}

或者为成员和参数使用不同的名称。

【讨论】:

    【解决方案3】:

    x=x; 行没有任何意义,因为它将变量x 的值分配给同一个变量。

    如果您有名为x 的字段,则应使用this 关键字:this.x = x 引用它。在这种情况下,您将参数x 的值分配给成员x

    但这并不意味着您必须始终使用this 来指代成员。如果您有与您的范围具有相同标识符的局部变量,则必须执行此操作。

    【讨论】:

    • 是的,我明白这一点。但是因为我将 5,5,50 的值传递给构造函数。 System.out.println(new Circle(5,5,50));传递的值不应该替换参数.public Circle(int x,int y,int radius)。
    • 这些值确实传递给了您的构造函数。但是,它们没有分配给成员变量。它们再次被重新分配给构造函数的参数。
    • 好的。但在那种情况下,当我向构造函数参数发送值时,x=5,y=5,radius=50。现在在我尝试设置值时在构造函数中。不应该将值设置为。 x=5,y=5,半径=50。抱歉夸大了,但我需要知道。感谢您的帮助。
    • 再次,x=5 在您的构造函数中起作用。问题是“x 是什么?”答案是“x 是构造函数的参数”。这意味着在表达式 x = x 中,您将 x 的值分配给它自己。如果要引用成员变量,请使用this.x
    • Alex 现在我知道局部变量会影响实例变量。所以现在唯一剩下的就是一个局部变量。但是还有一个问题。正如我们所知,局部变量应该分配给某个值。它没有像实例变量那样初始化为默认值。在这种情况下,我向他们发送值 5,5,50。不确定它们是如何分配到值 0
    【解决方案4】:

    这是你使用this的地方:

    public Circle(int x,int y,int radius)
    {
        this.x=x;
        this.y=y;
        this.radius=radius;
    }
    

    没有this,你实际上只处理局部变量 x,y 等

    【讨论】:

      【解决方案5】:

      局部变量隐藏实例变量

      构造函数中的局部变量会隐藏实例变量 无论您在何处分配和读取实例变量,请使用 this 关键字

      考虑下面的例子

      public class Employee{
          int id;
          String name;
      
      public Employee(int id, String name){
          this.id = id; //sets the id to the Employee's id
          this.name = name; //sets the name to Employee's name
      }
      }
      

      你在构造函数中所做的不会有任何效果。如果您使用的是 eclipse,您可以很容易地看到一条警告说 The assignment to variable id has no effect

      当您在执行new Circle(5,5,50)) 时,您的构造函数只是重新分配局部变量,甚至没有触及实例变量。

      但是当您使用return "center("+x+" , "+y+") and radius ("+radius+")"; 打印值时,您指的是实例变量。因为您的 toString 方法中没有阴影。这就是为什么你得到 0,因为所有实例变量都使用默认值初始化

      【讨论】:

      • 好的。但在那种情况下,当我向构造函数参数发送值时,x=5,y=5,radius=50。现在在我尝试设置值时在构造函数中。不应该将值设置为。 x=5,y=5,半径=50。抱歉夸大了,但我需要知道。感谢您的帮助。
      • @kemparaj565 请查看更新后的答案
      • 是的,我确实看到了。谢谢希乔哈里。但是还有一个问题。正如我们所知,局部变量应该分配给某个值。它没有像实例变量那样初始化为默认值。在这种情况下,我向他们发送值 5,5,50。不确定它们是如何分配到值 0 的。
      • @kemparaj565 现在看看
      • 太棒了!!!!!!希乔哈里。现在我明白了。这里构造函数只处理局部变量。它甚至没有触及实例变量。因此会显示默认值。
      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多