2013-02-25 2 views
-1

Я новичок в Java, и нужно помочь понять способы проходных ссылочных типов данных для параметра метода или конструктораИспользование ссылочных типов данных для параметра метода или конструктора

J2SE учебник Oracle говорит:

В этом примере метод создает новый объект Polygon и инициализирует его из массива объектов Point (предположим, что точка является классом, который представляет собой х, у координаты):

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- data-type-by-reference – Alex

ответ

1

В коде Polygon будет как таковой:

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.

Если вам нужны дополнительные разъяснения, просто спросите.

EDIT: Пол Bellora отметил, что есть некоторые обстоятельства, при которых метод polygonFrom может изменить points массив, и я попытаюсь объяснить, что здесь. Однако, если это не имеет никакого смысла, то вам не стоит беспокоиться об этом совсем (все это очень много).

Метод polygonFrom может изменять любую переменную в пределах ее собственного метода и внутри класса в целом. Следовательно, если массив points был инициализирован вне метода (то есть вне метода main), метод polygonFrom мог бы изменить массив points, но только если код внутри метода polygonFrom говорит, что он непосредственно изменяет эту переменную. Я надеюсь в этом есть смысл.

Например, в классе:

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 

} 

Конструктор будет посылать polygonFrom переменную points, но polygonFrom получает переменную и создает новый экземпляр. Метод polygonFrom теперь изменяет свою вновь созданную переменную corners, которая имеет те же значения, что и points.Однако, если метод polygonFrom специально говорит об изменении переменной points, тогда он будет технически изменять переменную, которую отправил ей конструктор.

+0

Этот ответ вводит в заблуждение, поскольку содержимое массива * может * быть модифицировано с помощью метода, в который он был передан. Я думаю, что точка, которую вы пытаетесь сделать, заключается в том, что ссылка на массив может быть переназначена в методе, а ссылка на сайте вызова все равно будет указывать на исходный объект массива. –

+0

@PaulBellora Спасибо! Ты прав. Я добавил в раздел, чтобы объяснить это, но я не уверен, объяснил ли я очень хорошо. –

+0

@ Ionnez Спасибо за тонну за ваше время. Я знаю, что много задаю ... но я чистый статер. Можете ли вы объяснить то же самое со своим собственным примером ..? Спасибо –

0

Его простой, проверить код ниже -

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

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

метод а() создает список и передает свою ссылку на метод Ь(), так что б() может изменить содержимое списка. Таким образом, в этом случае список один и тот же, просто его ссылка передается. Копия списка НЕ ​​производится здесь.

Надеюсь, это поможет.

Смежные вопросы