Java 为什么输出是这样的?(爪哇)

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

这是一个来自矩形类的实例方法,我们在该类中修改矩形的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,但我不完全确定为什么。有人能解释一下原因吗?

您已经在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不是。