Java에서 값 호출에 대한 이해 분석
Java는 객체 인스턴스를 참조로 조작합니다.
확인 가능한 것은 Java에서 객체를 조작하는 방식이 참조하는 방식입니다.이 점을 더욱 깊이 이해하기 위해 나는 다음과 같은 코드를 썼다.
먼저 사용자 정의 형식을 정의합니다
public class Person {
String name;
Person(String name){
this.name = name;
}
}
여기name 기본값은public입니다.그리고 ain 함수의 호출은 다음과 같습니다.
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("Paul");
Person p2 = new Person("Griefen");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
Person 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 = Paul p1.name = Griefen p2.name = Griefen
어?왜 이렇게 결과가 나올까요?CPPer로서 곤혹스러워요!인용하기로 했잖아요. 그럼 다음과 같은 문장을 집행한 후에Person tmp;
tmp = p1;
p1 = p2;
왜냐하면 나는 C++에서 인용한 개념에 따라 이 조작을 이해하기 때문이다. 그러면 tmpp1p2는 이때 모두 같은 대상이어야 한다. 즉, 모두 p2라는 대상을 가리켜야 한다.그러나 출력 결과는 이러한 이해가 옳지 않다는 것을 분명히 증명한다!그럼 자바에서의 인용은 C++에서의 인용과 같은 것이 아니라면?!!혹시 C++의 바늘과 같은 건가요?좋아요.우리는 C++의 지침에 따라 이 조작 과정을 이해해 봅시다.
우선 Person tmp;포인터 선언이 C++의 포인터 선언과 유사합니다.한편, C++에 인용된 성명은 이렇게 단독으로 쓰면 안 된다고 명확하게 규정되어 있다. 인용된 성명은 하나의 대상을 가리켜야 한다. 분명히 첫 번째 추리는 정확하다.좋은 시작이야!그리고 tmp=p1;p1 = p2; 분명히 tmp는 p1을 가리키고 p1은 p2를 가리키며 출력 결과를 대조합니다.딱 맞았어요!
그러면 자바의 인용이 C++의 데이터 조작과 비교한다면 C++의 바늘의 개념과 더욱 가까워야 한다는 것을 설명한다!
C++ 포인터는 상기 기능을 실현한다
위의 자바 조작 대상 방식이 C++의 바늘과 비슷하다고 했으니 C++에서 위의 방식을 실현하는 것이 어떻게 실현되는지 살펴보자.
#include "stdafx.h"
#include <string>
#include <iostream>
class Person
{
public:
std::string name;
public:
Person(std::string name)
{
this->name = name;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Person* p1 = new Person("Paul");
Person* p2 = new Person("Griefen");
std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
Person* tmp;
tmp = p1;
p1 = p2;
std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
delete tmp;
delete p1;
return 0;
}
디버깅 후에 출력 결과가 위의 Java 실행 결과와 같다는 것을 발견하였다어떤 언어의 밑바닥 실현도 마찬가지다
자바에서 인용 효과가 C++의 바늘과 같아 보이는데 왜 자바에서 바늘이라고 부르지 않습니까?분명히 차이가 있다. 예를 들어 자바의 인용은++ 연산을 할 수 없고 C++의 바늘은 할 수 있고 이동도 자유롭다.분명히 이 점에서 자바는 지침에 대해 많은 작업을 해서 그것을 더욱 안전하게 운행하도록 제한했다.그러나 상층부가 아무리 커 보여도 하층부에 도착하면 메모리를 신청해야 하고 메모리가 다 떨어지면 방출해야 한다.이것은 어떤 언어에서든 해야 할 일이다.
본 논문이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.