Java - 指针等价物

时间:2013-08-22 15:29:06

标签: java pointers function-pointers

在过去的一周里,我一直在使用这样的功能

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做到这一点。

5 个答案:

答案 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);