Java 为什么输出是这样的?(爪哇)
这是一个来自矩形类的实例方法,我们在该类中修改矩形的x和y坐标及其宽度和高度Java 为什么输出是这样的?(爪哇),java,object,Java,Object,这是一个来自矩形类的实例方法,我们在该类中修改矩形的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); Syst
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,但我不完全确定为什么。有人能解释一下原因吗?您已经在modify方法中为X创建了一个int类型的新对象。这意味着它只存在于该方法中,因为您不是通过引用传递它。因此,在modify方法中newX值仅为5,但在modify方法之外不存在“5”。这个.y工作得很好,因为您调用了对象的特定实例并修改了它的值。因此,它被保留在方法之外。”width=width'不起作用,因为您输入了50作为宽度,因此只需指定50=50this.height=h’很好,但你说的是‘this.height=height’。但是,根据您给出的代码,“height”不存在。您已经在modify方法中为X创建了int类型的新对象。这意味着它只存在于该方法中,因为您不是通过引用传递它。因此,在modify方法中newX值仅为5,但在modify方法之外不存在“5”。这个.y工作得很好,因为您调用了对象的特定实例并修改了它的值。因此,它被保留在方法之外。”width=width'不起作用,因为您输入了50作为宽度,因此只需指定50=50this.height=h’很好,但你说的是‘this.height=height’。但是,根据您给出的代码,“height”不存在。y是在modify方法中实际修改的唯一实例变量。传入的其他参数对对象的状态没有净影响。y是在modify方法中实际修改的唯一实例变量。传递的另一个参数对对象的状态没有净影响。实际上,代码不应该编译。方法调用中未定义高度。除非这是代码段中未包含的另一个属性
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
}
int x=newX创建一个名为x的新int,然后您对它不做任何处理。这就是为什么r3.getX返回0,因为您从未修改过它
此.y=y更改矩形类中字段y的值。这就是为什么此更改在输出中显示为5
width=width将名为width的方法参数更改为自身。它不会更改值,但也不会在矩形内设置字段宽度。未显示更改,原始值为10张
如果height在别处是一个字段,那么r3.getHeight不会更新该字段是有意义的,因为方法调用中的参数是h,而不是height。如果没有,那么我不知道代码是如何编译的,因为高度在任何地方都没有提到。实际上,代码不应该编译。方法调用中未定义高度。除非这是代码段中未包含的另一个属性 int x=newX创建一个名为x的新int,然后您对它不做任何处理。这就是为什么r3.getX返回0,因为您从未修改过它 此.y=y更改矩形类中字段y的值。这就是为什么此更改在输出中显示为5 width=width将名为width的方法参数更改为自身。它不会更改值,但也不会在矩形内设置字段宽度。未显示更改,原始值为10张
如果height在别处是一个字段,那么r3.getHeight不会更新该字段是有意义的,因为方法调用中的参数是h,而不是height。如果没有,那么我不知道代码是如何编译的,因为高度在任何地方都没有提到。int x=newX行在堆栈上创建了一个变量x,该变量仅在当前方法调用期间存在
x将引用由类构造函数创建的x。这可能就是getX返回的值。int x=newX行在堆栈上创建了一个变量x,该变量仅在当前方法调用期间存在
x将引用由类构造函数创建的x。这可能是getX返回的值。此代码显示函数堆栈变量和对象变量之间的差异。对于函数modify,四个传递变量位于堆栈上。该行声明一个堆栈变量x并将其值设置为newX。第二行使用对象变量this.y并设置为传递变量y。第三行是为堆栈上的自身指定宽度。第四行使用对象变量“高度”并指定给其自身。一旦程序超出函数modify的作用域,它的所有堆栈变量的值都将被重击。因此结果是0 5 10 10,因为只有第二行不是堆栈变量this.y在调用函数modify后保留其值。此代码显示了函数堆栈变量和对象变量之间的差异。对于函数modify,四个传递变量
它们在堆栈上。该行声明一个堆栈变量x并将其值设置为newX。第二行使用对象变量this.y并设置为传递变量y。第三行是为堆栈上的自身指定宽度。第四行使用对象变量“高度”并指定给其自身。一旦程序超出函数modify的作用域,它的所有堆栈变量的值都将被重击。因此结果是0 5 10 10,因为只有第二行不是堆栈变量this.y在调用函数modify后保留其值。我想冒昧地说,您的问题在于如何将x、y、宽度和高度的新值分配给矩形对象 假设您的modify方法位于rectangle类中,您的代码当前看起来是这样的,我在错误上添加了注释:
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
}
如您所见,遵守约定可以减少代码的混乱,使代码更易于阅读。这也让你更容易看到自己的错误,因为它们通常会像拇指酸痛一样从你的习惯中突出出来。不要担心,这需要实践。我敢说,您的问题在于如何为矩形对象指定新的x、y、width和height值 假设您的modify方法位于rectangle类中,您的代码当前看起来是这样的,我在错误上添加了注释:
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
}
如您所见,遵守约定可以减少代码的混乱,使代码更易于阅读。这也让你更容易看到自己的错误,因为它们通常会像拇指酸痛一样从你的习惯中突出出来。别担心,这需要练习。这个问题太模糊,无法给出有意义的答案。你能解释一下你在理解代码时遇到的困难吗?那么我们就可以帮忙了。这个问题太模糊了,没有一个有意义的答案。你能解释一下你在理解代码时遇到的困难吗?那我们就可以帮上忙了。我确实在写类似的东西。请发布一个完整的工作示例,其中包含一个主要方法等,以再现问题。此外,modify不会修改矩形对象,因为矩形中没有名为modify的方法,除非您将矩形对象子类化。例如,this.y,“this”指的是什么?是否有一个局部变量声明为y?在你给出的例子中,r3不是y,我写的是类似的东西。请发布一个完整的工作示例,其中包含一个主要方法等,以再现问题。此外,modify不会修改矩形对象,因为矩形中没有名为modify的方法,除非您将矩形对象子类化。例如,this.y,“this”指的是什么?是否有一个局部变量声明为y?在您给出的示例中,r3的y不是。