在java中的构造函数中的混淆

时间:2015-03-19 09:17:00

标签: java

通过将参数名称保留为实例变量名称来尝试从构造函数初始化实例变量时。我收到的输出为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)//构造函数参数采用的值

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

将构造函数更改为:

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

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

答案 2 :(得分:0)

这是您使用this

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

没有this你实际上只在局部变量 x,y等上工作。

答案 3 :(得分:0)

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

如果您的字段名为x,则应使用this关键字this.x = x引用该字段。在这种情况下,您将为成员x指定参数x的值。

但这并不意味着您总是必须使用this来引用成员。如果局部变量具有与作用域相同的标识符,则必须执行此操作。

答案 4 :(得分:0)

本地变量会影响实例变量

构造函数中的局部变量会影响实例变量 无论您分配和阅读实例变量,都可以使用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,因为所有的实例变量都是用默认值

初始化的