Java에서 값 호출에 대한 이해 분석

3797 단어 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++의 바늘은 할 수 있고 이동도 자유롭다.분명히 이 점에서 자바는 지침에 대해 많은 작업을 해서 그것을 더욱 안전하게 운행하도록 제한했다.그러나 상층부가 아무리 커 보여도 하층부에 도착하면 메모리를 신청해야 하고 메모리가 다 떨어지면 방출해야 한다.이것은 어떤 언어에서든 해야 할 일이다.
본 논문이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기