2013-09-05 4 views
-1

"Java является pass-by-value"
- Java Language Specification

Однако, есть вещи, которые меня смущает. Пожалуйста, проблеск моего примераJava - Параметр Передача Путаница

public class Main { 

    public static void main(String[] args) { 

     StringBuilder myBuilder = new StringBuilder("Michael"); 

     editString(myBuilder); 

     System.out.println(myBuilder); 

    } 

    public static void editString(StringBuilder x){ 
     x.append(" Ardan"); 
    } 

} 

Выход:

Michael Ardan 

И этот пример:

public class Main { 

    public static void main(String[] args) { 

     int myInt = 10; 

     editInt(myInt); 

     System.out.println(myInt); 

    } 

    public static void editInt(int x){ 
     x ++; 
    } 
} 

Выход:

10 

Я пытался читать другие статьи и его все говорит, что Java - это alwa ys pass-by-value. Я сделал несколько тестовых сценариев. Сравнение обоих примеров друг с другом заставило меня подумать, что объекты Java - это pass-by-reference, а примитивные типы - pass-by-value. Однако, если вы попытались заменить примитивный тип int на объект Integer, результат будет таким же. Мне было бы интересно, если кто-нибудь объяснит эти два примера здесь.

+0

В объектах Java всегда передаются по ссылке, а переменные - по значению. Также Строки являются неизменяемыми объектами. –

+2

@ H-Patel каждая статья, даже JLS говорит, что Java строго передается по величине независимо от типа данных. –

+0

@Thilo Это был хороший вопрос. Я также пробовал прочитать ответы и сделал свои сценарии. Я действительно спрашивал о том, что происходит за моими примерами. –

ответ

3

Строго говоря, Java является пропущенным значением.

Однако, что передается по значению, это «указатель» на объект. Таким образом, вы сможете получить доступ и изменить состояние этого объекта внутри вызываемого метода (и эти изменения видны всем, у кого есть «указатель» на тот же объект).

Передача по ссылке означает, что вы можете изменить место, на которое указывает переменная на вызывающей стороне. Это невозможно сделать на Java.

Например

public static void editString(StringBuilder x){ 
    x = new StringBuilder("Foo"); 
    } 

не оказывает никакого влияния за пределами метода. В pass-by-reference вы фактически должны назначить новый StringBuilder обратно в переменную вызывающего метода.

-2

Вы правы, java-объект всегда передается по ссылке, но вы можете видеть исходный код класса-оболочки, например «Integer», «String», «Short» и т. Д. как окончательный .it не может быть изменен. Кроме того, вопрос «если вы попытаетесь заменить примитивный тип int на Integer Object, результат будет таким же». которые связаны с ним. Когда вы заменяете объект Integer и изменяете значение в вашем методе. объект изменяется. поэтому вы можете увидеть результат.

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