무엇이'값을 의미'와'포인터를 의미'의미합니까?
-
03-07-2019 - |
문제
무엇을 의미하는'값을 의미',그리고 무엇을 의미하는'암시적 포인터를 의미'?
해결책
Java는 객체 유형에 대한 암시 적 포인터 시맨틱과 프리미티브에 대한 가치 의미를 사용하고 있습니다.
가치 의미론 란 값을 직접 처리하고 사본을 전달한다는 것을 의미합니다. 여기서 요점은 가치가있을 때 등 뒤에서 바뀌지 않을 것이라고 믿을 수 있다는 것입니다.
포인터 시맨틱을 사용하면 가치가없고 '주소'가 있습니다. 다른 사람이 거기에 무엇이 있는지 바꿀 수 있습니다.
C ++의 포인터 의미론 :
void foo(Bar * b) ...
... b->bar() ...
포인터 시맨틱을 요청하고 포인트에서 방법을 호출하려면 * *가 필요합니다.
자바의 암시 적 포인터 의미 :
void foo(Bar b) ...
... b.bar() ...
가치 의미를 사용하는 선택이 없기 때문에 *는 필요하지 않습니다.
다른 팁
기본적으로 값을 의미는 것을 의미 할당 값을 다른 값 복사본을 만들:
int x = 1;
int y = x;
x = 2; // y remains the same!
특별한 케이스가 함수 호출되는 통과 인수:
void f(int x) {
x = 5;
}
int a = 1;
f(a);
// a is still 1
이것은 실제로 동일한 Java and C++.그러나 자바를 알고있는 몇 가지 기본 형식,그 중 int
, double
, boolean
고 char
, 와 함께 열거되는 행동을 이런 식으로 구성됩니다.모든 다른 형식을 사용하여 의미를 참조하는 것을 의미하는 과제 중 하나의 값을 다른 값은 실제로 리디렉션 포인터를 대신에 복사하는 기본값:
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
...)은 실제로 immutables.자신의 값을 변경할 수 없습니다 및 모든 할당하여 그들에게 재정의 오래된 값입니다.
또한,인수 여전히 값으로 전달됩니다.이것이 의미하는 개체의 값을 전달하는 기능이 변경 될 수 있습니다하지만 대한 참조를 할 수 없습니다:
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!
Java는 합격 가치로 가치가 있습니다. C ++는 가치 및 기준 의미를 모두 사용할 수 있습니다.
Java는 사용합니다 implicit pointer semantics
~에 가변 액세스 (참조를 직접 편집 할 수없고, Access의 객체로 자동으로 (암시 적으로) 해결됨) 또한 사용합니다. Pass-by-Value semantics
~에 통과 방법 매개 변수.
Java 응용 프로그램에서 객체 참조가 메소드의 매개 변수 인 경우 참조 자체가 아닌 참조 사본 (Pass By Value)을 전달합니다. 호출 메소드의 객체 참조 및 사본은 동일한 객체를 가리키고 있습니다. 이것은 중요한 차이점입니다. Java 응용 프로그램은 C ++와 같은 다양한 유형의 매개 변수를 전달할 때 다르게 수행하지 않습니다. Java 응용 프로그램은 모든 매개 변수를 값별로 전달하므로 유형에 관계없이 모든 매개 변수의 사본을 만듭니다.
짧은 : Java의 모든 매개 변수는 값으로 전달됩니다. 그러나 이것이 객체가 복사 된 것을 의미하지는 않지만 (PHP4의 기본값과 같이) 해당 객체에 대한 참조가 복사됩니다.
모든 설명과 심도있는 예제가 표시됩니다 Java 응용 프로그램의 패스 별 의미