2013-02-25 25 views
-1

我是新来的Java,并且需要的参数帮助理解的方式来通参考的数据类型的方法或构造函数的参数使用参考的数据类型的方法或构造

Oracle的J2SE教程说:

在这个例子中,该方法将创建一个新的多边形对象,并从点对象的数组进行初始化(假定点是一个表示X A类,y坐标):

public Polygon polygonFrom(Point[] corners) { 
    // method body goes here 
} 

但这并没有帮助我理解这个概念。详细的解释非常感谢。

+0

检查这些链接。 http://stackoverflow.com/questions/40480/is-java-pass-by-reference和 http://stackoverflow.com/questions/4319537/how-do-i-pass-a-primitive-数据类型引用 – Alex 2013-02-25 05:23:29

回答

1

在代码中,多边形是这样:

Point[] points = new Point[]{new Point(1,1), new Point(2,2)}; 
Polygon p = polygonFrom(points); 

除了与您的括号的内角的阵列。

这基本上给polygonFrom函数points阵列和做它喜欢什么。然而,无论polygonFrom方法确实不会改变原始的points数组,但它会创建它自己的操作。

例如,可以说我有代码,像这样:

String s = "Cheeseburger"; 
sayString(s); 

和方法:

public void sayString(String par1) 
{ 
    par1 = par1 + "1"; 
    System.out.println(par1); 
} 

此输出:Cheeseburger1,但字符串s仍然只有Cheeseburger

如果您需要进一步澄清,请询问。

编辑: 保罗Bellora指出,有一些情况,其中polygonFrom方法可以改变points阵列,我会尝试在这里解释一下。然而,如果这没有任何意义,那么你不应该担心它(所有这些都是需要考虑的)。

polygonFrom方法可以在其自己的方法和整个类内更改任何变量。因此,如果points阵列在方法之外初始化(即在main方法之外),则polygonFrom方法可能会更改points阵列,但前提是方法内部的代码表示直接更改该变量。我希望这是有道理的。

例如,在类:

Point[] points; 

public MethodAccess()//constructor 
{ 
    points = new Point[]{new Point(1,1), new Point(2,2)}; 
    Polygon p = polygonFrom(points); 
} 

public Polygon polygonFrom(Point[] corners){ 

    //doing stuff with corners variable here 

    points = corners; //this will change the points variable that was passed 

} 

构造将发送polygonFrompoints变量,但polygonFrom得到变量,并创建它的一个新的实例。 polygonFrom方法现在会更改其最新创建的corners变量,该变量最初的值与points的值相同。但是,如果方法polygonFrom明确说要更改points变量,那么它在技术上会更改构造函数发送给它的变量。

+0

此答案具有误导性,因为数组*的内容可以通过传入的方法进行修改。我认为你试图做的一点是,可以在方法中重新分配对数组的引用,并且调用站点上的引用仍然会指向原始数组对象。 – 2013-02-25 05:29:57

+0

@PaulBellora谢谢!你是对的。我在一节中添加了解释,但我不确定我是否解释得很好。 – 2013-02-25 05:40:29

+0

@Ionnez谢谢你的时间。我知道我在问很多......但我是一个纯粹的人。你能解释一下你自己的例子吗??谢谢 – 2013-02-25 11:18:07

0

其简单,检查下面的代码 -

public void a() { 
    List<String> list = new ArrayList<String>(); 
    b(list); 
} 

public void b(List<String> list) { 
    list.add("something"); 
} 

方法a()创建的列表,并通过它的参考方法b(),使B()可以修改列表的内容。所以在这种情况下,列表是一样的,只是它的参考被传递了。列表的副本不在此处。

希望这会有所帮助。

相关问题