在过去的一周里,我一直在使用这样的功能
function Rectangle setRectangle(Rectangle rect){
rect = new Rectangle(p,q,r,s);
return rect;
}
Rectangle rect;
rect = setRectangle(rect);
我只想做
function void setRectangle(Rectangle rect){
rect = new Rectangle(p,q,r,s);
}
Rectangle rect;
setRectangle(rect);
我知道c ++中有一些指针,我们可以将指针设置为函数中的任何指针,并在真实变量中设置。我想知道如何用Java做到这一点。
答案 0 :(得分:0)
在Java中有引用而不是指针。它们允许您修改您具有引用的对象。例如,然后您将Rectangle
传递给setRectangle
,该方法可以调用rect
对象的变异成员,更改已传入的对象:
static void setRectangle(Rectangle rect){
rect.Top = p;
rect.Left = q;
rect.Width = r;
rect.Height = s;
}
static void main(String[] args) {
Rectangle r = new Rectangle(a, b, c, d);
// At this point r is defined as {a,b,c,d}
setRectangle(r);
// At this point r is defined as {p,q,r,s}
}
请注意,如果将null
传递给rect
,这将不起作用:虽然对象是通过引用传递的,但引用是按值传递的。
答案 1 :(得分:0)
你应该看看这篇关于java如何通过引用传递的帖子:Is Java "pass-by-reference" or "pass-by-value"?
java方法是:
void setRectangle(Rectangle rect){
rect = new Rectangle(p,q,r,s);
}
Rectangle rect = setRectangle(rect);
这是因为你在setRectangle函数中新建了一个矩形。
但是你可以像这样修改传入的矩形:
void setRectangle(Rectangle rect){
rect.setP(p);
rect.setQ(q);
...
}
Rectangle rect;
setRectangle(rect);
答案 2 :(得分:0)
该方法的意图是什么? set
前缀当然具有误导性,您应该选择一个反映该方法实际用途的前缀。
如果是创建一个矩形,那么它是一个工厂方法:
Rectangle createRectangle() {
return new Rectangle(p,q,r,s);
}
如果您想(重新)配置现有实例:
void configure(Rectangle rect) {
rect.x=p;
rect.y=q;
rect.width=r;
rect.height=s;
}
答案 3 :(得分:0)
每次在Java中创建对象时,实际上都是在创建指向对象的指针。但是,与c / c ++不同,Java没有指针算法,我想你正在寻找。每次传递一个对象时,实际上都是指向它的一个指针(参考)。
但是你编写的代码看起来不像Java,因为Java没有function
个关键字。
你所写的内容看起来应该和构造函数做同样的工作。但我不明白的是,你从哪里得到p,q,r,s?你可以这么做:
Rectangle rect = new Rectangle(anotherRectangle) //where anotherRectangle is some other rectangle you have previously defined.
或
Rectangle rect = new Rectangle(int width, int height)
或
Rectangle rect = new Rectangle(int x, int y, int width, int height)
或
Rectangle rect = new Rectangle(someDimension) //where someDimension is some other dimension you have previously defined.
答案 4 :(得分:0)
既然你提到了C ++,那么将你的代码转换成C ++中的等价代码是有益的,所以你真的明白它的含义:
Rectangle *setRectangle(Rectangle *rect) {
rect = new Rectangle(p,q,r,s);
return rect;
}
Rectangle *rect;
rect = setRectangle(rect);