这是一个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,但我不完全确定原因。谁能解释为什么?
答案 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
}
正如您所看到的,坚持使用约定会使代码更容易混淆和更容易阅读。这也可以让你更容易地看到你的错误,因为它们通常会像你的拇指一样伸出你的惯例。不要担心它伴随着练习。