2008-10-03 3 views

답변

11

Java는 객체 유형에 대한 암시 적 포인터 의미 체계와 프리미티브에 대한 값 의미를 사용합니다.

값 의미 란 값을 직접 처리하고 사본을 전달한다는 의미입니다. 여기에 요점은 가치가있을 때 뒤에서 바뀌지 않을 것이라는 것을 믿을 수 있다는 것입니다.

포인터 의미론을 사용하면 값이 없으며 '주소'를 갖게됩니다. 다른 사람이 그곳에있는 것을 변경할 수 있습니다. 알 수 없습니다. C++에서

포인터 의미는 :

void foo(Bar * b) ... 
... b->bar() ... 

당신은 포인터의 의미를 요청하는 *이 필요 ->는 pointee에 메소드를 호출 할 수 있습니다. 자바

암시 포인터 의미 :. 사이

void foo(Bar b) ... 
... b.bar() ... 

당신이 값 의미를 사용하는 선택의 여지가 없기 때문에

의 * 필요하지 않습니다 구별도 ->하고, 따라서 암시.

1

자바 (당신이 직접 인 타이틀 (암시, 참조를 편집 할 수 없습니다) 액세스에 개체로 확인됩니다) 변수 액세스implicit pointer semantics을 사용하고 또한 메소드 매개 변수가 전달에 Pass-by-Value semantics를 사용합니다.

읽기 Pass-by-value semantics in Java applications : 객체 참조가 메서드에 매개 변수가

Java 응용 프로그램에서

, 당신은 기준의 사본을 전달하는 (값 통과)가 아닌 참조 자체 . 호출 메서드의 개체 참조 및 복사 동일한 개체를 가리키는 것을 유의하십시오. 이것은 중요한 구별입니다. Java 응용 프로그램은 과 같이 다양한 유형의 매개 변수 을 전달할 때 다름없이 아무것도 수행하지 않습니다. Java 응용 프로그램은 모든 매개 변수를 값으로 전달하므로 형식에 관계없이 모든 매개 변수의 복사본을 개로 만듭니다.

약식 : Java의 모든 매개 변수는 값으로 전달됩니다. 그렇다고해서 PHP4에서 기본값처럼 Object가 복사되는 것은 아니지만 해당 객체에 대한 참조가 복사됩니다.

int x = 1; 
int y = x; 
x = 2; // y remains the same! 

특별한 경우는 함수 호출은 다음과 같습니다 당신은 기본적으로 Pass-by-value semantics in Java applications

10

에 대한 모든 설명과 심도있는 예를 볼 수 있습니다

는 값의 의미는 다른 하나 개의 값을 할당하는 복사본을 생성한다는 것을 의미 이 인수는 인수를 전달받습니다.

void f(int x) { 
    x = 5; 
} 

int a = 1; 
f(a); 
// a is still 1 

이것은 실제로 Java와 C++에서 동일합니다. 그러나 Java는 int, double, booleanchar 중 소수 유형 만이 방식으로 작동하는 열거 형과 함께 알 수 있습니다. 다른 모든 종류의 다른 하나 개의 값의 할당이 실제로 대신 기본 값을 복사하는 포인터를 리디렉션 즉 참조 시멘틱스를 사용 : 몇 가지주의 그러나이있다

class Foo { 
    int x; 

    public Foo(int x) { this.x = x; } 
} 

Foo a = new Foo(42); 
Foo b = a; // b and a share the same instance! 
a.x = 32; 
//b.x is now also changed. 

. 예를 들어 많은 참조 유형 (String, Integer ...)은 실제로 변경되지 않습니다. 그것들의 값은 변경할 수 없으며 그것들에 대한 어떠한 할당도 이전 값보다 우선합니다.

또한 인수는 여전히 값으로 전달됩니다. 즉, 함수에 전달 된 객체의 값은 변경할 수 있지만 참조는 다음과 같을 수 없습니다.

void f(Foo foo) { 
    foo.x = 42; 
} 

void g(Foo foo) { 
    foo = new Foo(42); 
} 

Foo a = new Foo(23); 
f(a); 
// a.x is now 42! 

Foo b = new Foo(1); 
g(b); 
// b remains unchanged! 
+0

왜 특별한 경우입니까? – morbidCode

+0

@morbidCode 특별한 경우가 무엇입니까? 인수 합격? 실제로 특별한 경우는 아니며, 할당과 동일하게 동작합니다 (구문 적으로 할당 *이 아닙니다). –

+0

나는 그것을 가지고 있는지 잘 모르겠다. f (x)에 a를 전달하면 a의 복사본이 만들어지고 그 복사본은 값 5로 지정되므로 메서드가 복사본을 반환하고 원본 A의 값이 그대로 유지됩니까? – morbidCode

3

Java는 값으로 전달됩니다. C++은 값 및 참조 의미를 모두 사용할 수 있습니다.

http://javadude.com/articles/passbyvalue.htm

+2

자바의 숨겨진 포인터로 인해 설명이 잘못되었다. (포인터 자체가 지나쳤다 고해도). 값.) – finnw

+1

@ finnw : 그렇지만 Java 개발자는 함수 안에서 뾰족한 데이터를 변경하기를 원한다면 외부의 원래 "참조"가 변경되지 않았기 때문에 놀라지 않을 수 없으므로 Java 개발자는이를 이해해야합니다. 이것은 그들의 "참조"가 복사되는 것을 이해하는 것이 중요합니다. – paercebal

+1

Bartosz : 내 기사를 퍼뜨리는 사람들을 만나서 반갑습니다.) finnw : "숨김"은 핵심 단어가 있습니다 ... 우리는 Java에서 누군가 프로그램하는 방법에 대해 이야기합니다. 장면의 배후에있는 구현 메커니즘은 Java가 엄격하게 가치가 있다는 사실을 바꾸지 않습니다. Java 언어 스펙을 읽어 철자를 확인하십시오. 아웃. –

관련 문제