이 기사에서는 예제를 통해 Java의 값별 호출을 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
Java는 참조를 통해 객체 인스턴스를 작동합니다.
확인할 수 있는 것은 Java에서 객체를 조작하는 방법은 참조에 의해 객체를 조작하는 것이라는 점이다. 이것을 더 깊이 이해하기 위해 다음 코드를 작성했습니다.
먼저 사용자 정의 유형을 정의하십시오. 코드는 다음과 같습니다. public class Person {
문자열 이름;
사람(문자열 이름){
this.name = 이름;
}
}
여기서 이름은 기본적으로 public으로 설정됩니다(C++의 클래스 기본 속성과 다름).
그런 다음 Main 함수의 호출은 다음과 같습니다.
다음과 같이 코드를 복사합니다. public class Main {
/**
* @param 인수
*/
공개 정적 무효 메인(String[] args) {
// TODO 자동 생성된 메서드 스텁
Person p1 = new Person("폴");
Person p2 = new Person("그리펜");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
사람 tmp;
tmp = p1;
p1 = p2;
System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name);
}
}
이때 출력은 다음과 같습니다.
다음과 같이 코드를 복사합니다. p1.name = Paul p2.name = Griefen
tmp.name = 폴 p1.name = 그리펜 p2.name = 그리펜
뭐? 왜 이런 결과가 나온 걸까요? CPPer로서 저는 혼란스럽습니다! 참조용이므로 아래 문장을 실행한 후 다음과 같이 코드를 복사합니다. Person tmp;
tmp = p1;
p1 = p2;
나는 C++의 참조 개념에 따라 이 연산을 이해하기 때문에, tmp p1 p2는 이때 모두 동일한 객체여야 합니다. 즉, 그들은 모두 객체 p2를 가리켜야 합니다. 그러나 출력은 이러한 이해가 잘못되었음을 분명히 증명합니다! 그러면 Java의 참조는 C++의 참조와 같지 않습니까? ! ! ! C++의 포인터와 같은 것인가요?
좋은! C++의 포인터에 따른 이 연산과정을 이해해보자.
우선, Person tmp는 C++의 포인터 선언과 유사한 포인터를 선언합니다. C++에서는 이렇게 참조 선언을 별도로 작성할 수 없다고 명시되어 있습니다. 참조 선언을 할 때는 개체를 가리켜야 한다는 점은 분명합니다. 좋은 시작이네요! 그러면 tmp = p1; p1 = p2; 분명히 tmp는 p1을 가리키고 p1은 p2를 가리킵니다. 일치하는 것으로 확인되었습니다!
즉, Java의 참조를 C++의 데이터 작업과 비교하면 C++의 포인터 개념과 더 유사해야 합니다!
C++의 포인터는 위의 함수를 구현합니다.
위의 Java 개체 조작 방법은 C++의 포인터와 유사하므로 C++에서 위 방법을 구현하는 방법을 살펴보겠습니다. #include "stdafx.h"
#include <문자열>
#include <iostream>
클래스 사람
{
공공의:
표준::문자열 이름;
공공의:
사람(표준::문자열 이름)
{
이->이름 = 이름;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
사람* p1 = new Person("Paul");
Person* p2 = new Person("그리펜");
std::cout<< "p1.name " << p1->이름 << " p2.name = " << p2->이름 << std::endl;
사람* tmp;
tmp = p1;
p1 = p2;
std::cout<<"tmp.name" << tmp->이름 << " p1.name " << p1->이름 << " p2.name = " << p2->이름 << std::endl ;
임시 삭제;
p1 삭제;
0을 반환합니다.
}
디버깅 후 출력 결과가 위의 Java 실행 결과와 동일한 것을 확인했습니다.
모든 언어의 기본 구현은 동일합니다.
Java의 참조 효과는 C++의 포인터와 동일한 것 같은데 왜 Java에서는 직접 포인터라고 부르지 않습니까? 분명히 차이점이 있습니다. 예를 들어 Java의 참조는 ++ 작업을 수행할 수 없지만 C++의 포인터는 마음대로 이동할 수 있습니다. 분명히 이 시점에서 Java는 포인터를 제한하고 더 안전하게 실행하기 위해 포인터에 대해 많은 작업을 수행했습니다. 하지만 상위 레이어가 아무리 커도 하위 레이어에 도달하면 메모리를 신청해야 하며, 메모리를 다 사용한 후에는 메모리를 해제해야 합니다. 이것은 어떤 언어로든 작동합니다!
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.