Java指针等价物

Java指针等价物,java,pointers,function-pointers,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,

在过去的一周里,我已经用了太多这样的函数了

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中实现它。

您在Java中使用的是引用而不是指针。它们允许您修改有引用的对象。例如,然后将一个
矩形
传递给
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
,这将不起作用:虽然对象是通过引用传递的,但引用是通过值传递的。

您应该看看这篇文章,了解java是如何通过引用传递的:

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

这个方法的目的是什么?“
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;
}

每次在Java中创建对象时,实际上都在创建指向该对象的指针。但是,与c/c++不同,Java没有指针算法,我想您正在寻找它。每次你传递一个对象,你实际上是在传递一个指向它的指针(引用)

但是您编写的代码看起来不像Java,因为Java没有
函数
关键字。 此外,您所编写的内容看起来应该与构造函数的工作相同。但我不明白的是,你从哪里得到p,q,r,s?你可以这样做:

Rectangle rect = new Rectangle(anotherRectangle) //where anotherRectangle is some other rectangle you have previously defined.


自从提到C++,将代码转换成C++中的等价类将是有益的,因此您真正理解它所说的:

Rectangle *setRectangle(Rectangle *rect) {
    rect = new Rectangle(p,q,r,s);
    return rect;
}

Rectangle *rect;
rect = setRectangle(rect);

您还没有在Java中使用它。你是说JavaScript吗?为什么我不能?我的意思是JavaJava不使用function关键字,javascript使用,Java需要返回类型。记住:Java对javascript的作用就像汽车对地毯的作用一样;rect=新矩形(1,2,4,5)??@usama8800否,这不会更改原始引用,因为引用本身是按值传递的。在函数内部对引用所做的更改不会反映在传入的引用上,这与在C/C++中对指针类型参数所做的更改不会反映在传入函数的指针上的方式非常相似。为此,您需要一个指向指针的指针-Java中没有类似的内置构造。@usama8800您可以构建自己的对象来包装一个矩形,并允许您在其中更改对矩形的引用。但是没有任何内置的东西能以这种方式工作。
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.
Rectangle *setRectangle(Rectangle *rect) {
    rect = new Rectangle(p,q,r,s);
    return rect;
}

Rectangle *rect;
rect = setRectangle(rect);