为什么输出这个? (JAVA)

时间:2009-11-20 03:52:57

标签: java object

这是一个Rectangle类的实例方法,我们修改矩形的x和y坐标及其宽度和高度

public void modify(int newX, int y, int width, int h) {
    int x = newX;
    this.y = y;
    width = width;
    this.height = height;
}

Rectangle r3 = new Rectangle(0, 0, 10, 10);
r3.modify(5, 5, 50, 50);
System.out.print(r3.getX() + " " + r3.getY() + " ");
System.out.println(r3.getWidth() + " " + r3.getHeight());

我有这个代码,我知道输出是0 5 10 10,但我不完全确定原因。谁能解释为什么?

7 个答案:

答案 0 :(得分:6)

public void modify(int newX, int y, int width, int h) {
    int x = newX;  // the value isn't saved to the class members
    this.y = y; // this is saved, hence you see the change in the y value
    width = width; // meaningless, the variable is overwritten with it's own value
    this.height = height; // who is height? the function receives h
}

答案 1 :(得分:0)

您已在modify方法中为X创建了一个类型为“int”的新对象。这意味着它只存在于该方法中,因为您没有通过引用传递它。因此,newX值在modify方法中仅为5,但在其外部不存在为“5”。 this.y工作正常,因为你已经调用了该对象的特定实例并修改了它的值。因此,它保留在方法之外。 'width = width'不起作用,因为您只需指定50 = 50(因为您输入了50作为宽度)。 'this.height = h'会很好,但你说'this.height = height'。但是,根据您提供的代码,“高度”不存在。

答案 2 :(得分:0)

y是唯一在modify方法中实际修改的实例变量。传入的另一个参数对对象的状态没有任何净影响。

答案 3 :(得分:0)

实际上,代码不应该编译。您的方法调用中未定义height。除非这是您未在代码段中包含的其他属性。

int x = newX创建一个名为int的新x,然后您不做任何事情。这就是r3.getX()返回0的原因,因为你从未修改它。

this.y = y更改Rectangle类中字段y的值。这就是为什么此更改在输出中显示为5。

width = width将名为width的方法参数更改为自身。它不会更改值,但也不会在width中设置字段Rectangle。没有显示变化,原始值为10张。

如果height是其他地方的字段,那么r3.getHeight()不会更新字段是有意义的,因为方法调用中的参数是h,而不是{{1 }}。如果没有,那么我不知道代码如何编译,因为height没有在任何地方提到。

答案 4 :(得分:0)

“int x = newX”行在堆栈上创建一个变量“x”,仅在当前方法调用期间存在。

“this.x”将引用类构造函数创建的“x”。这可能是“getX()”返回的原因。

答案 5 :(得分:0)

此代码显示了函数堆栈变量和对象变量之间的区别。对于函数修改,四个传递变量在堆栈上。该行声明了一个堆栈变量x并将其值设置为newX。第二行使用对象变量 this.y 并设置为传递变量 y 。第三行是在堆栈上为其自身分配 width 。第四行使用对象变量 height 并分配给它自己。一旦程序超出了函数 modify 的范围,它的所有堆栈变量的值都会被打破。所以结果是0 5 10 10,因为只有第二行不是堆栈变量 this.y 在调用函数修改后保留其值。

答案 6 :(得分:0)

我冒昧地说你的问题在于你如何为你的矩形对象分配x,y,宽度和高度的新值。

假设你的modify方法在矩形类中,你的代码目前看起来像这样(我在错误中添加了注释:

public void modify(int newX, int y, int width, int h) {
    int x = newX;   //you are declaring a new x here...not assigning newX to rectangle's x 
    this.y = y;     //this is correct
    width = width;          //here you're just assigning the parameter width its current value
    this.height = height;   //here you are assigning the rectangles height value to itself
}

我强烈建议找到一个命名约定并坚持使用它,因为它在这里会有很大的帮助。

尝试这样的事情:

public void modify(int x, int y, int w, int h) {  //changed names of parameters
    this.x = x;       //removed the int type declaration and used this. prefix 
    this.y = y;       //changed nothing
    this.width = w;   //adjusted for renamed parameter, used this. prefix
    this.height = h;  // adjusted for renamed parameter, again used this. prefix
}

正如您所看到的,坚持使用约定会使代码更容易混淆和更容易阅读。这也可以让你更容易地看到你的错误,因为它们通常会像你的拇指一样伸出你的惯例。不要担心它伴随着练习。