자바 객체의 할당 및 참조

과제 및 참고 문헌에 자바 객체 : 재현   https://blog.csdn.net/yz930618/article/details/76278997을

할당 및 자바 객체 참조는 항상 매우 막연한 이해, 그래서 나는이 블로그에 대한 철저한 이해를 작성할 계획하고있다 :

설명과 이해의 편의를 위해 간단한 클래스를 정의 :

공용 클래스 솔루션 {

    개인 INT들 a
    개인 INT의 B;

    무효 세타 공개 (INT A) {
        대단해 = A;
    }
    공공 무효 세트 B (INT 나) {
        this.b = B를;
    }
}
기준으로 할당하기 전에이의 혼란 많은 사람들을 줄 수 있도록, 피사체를 다시 방문하기 현상 :

     S1 = 새로운 새로운 솔루션 솔루션 ();
     s1.setA (1.)
     s1.setB (2)
     용액 S2의 =의 S1;
     s2.setA (-1)
우리 용액 S1 클래스 오브젝트를 정의하고, 그것의 멤버 변수 할당 . 그런 다음, 다른 객체 (S2)를 정의하고 있으므로 S2 = S1, S2 내가 지금 = -1에서 만들 경우 S1과 S2의 현재 가치는 얼마가 될 것인가?

아주 이상한, 변경 S2는 S1이 변경 이유?이 철저하게 이해하지 못했다 객체를 참조하여 할당하고, 주제에 다음 항목된다.

솔루션 S1 = 새로운 솔루션 ()의 경우,이 문이 문이 실행되는 작업은 우리가 잘 알고있는 개체를 만드는 것입니다,하지만 정말 네 단계로 구성

"새로운 솔루션"의 오른쪽 힙 공간에서 솔루션 클래스 개체를 만들 수있는 템플릿으로 솔루션 범주를 표현,
"()", 개체를 만든 후 더주고이 없기 때문에, 즉시, 생성자 솔루션 클래스를 호출합니다 괄호하는 매개 변수, 그것은 인수없이 기본 생성자를 호출합니다.
왼쪽 "솔루션 S1은"변수 솔루션 카테고리에 대한 참조를 생성하는, 즉 용액 객체 객체 참조를 가리키는 데 사용된다. C 언어에서이 포인터는 의미로 이해 될 수있다.
"=", 항등 연산자는 객체 참조 방금 만든 객체 (S1) 솔루션에 의해 지적이다.
그래서,이 문장은 두 개의 엔티티를 포함 하나는 객체 참조 변수이고, 하나는 객체 자체입니다.

그들 사이의 객체 참조와 관계의 이미지를 설명하기 위해, 당신은 비유 할 수 있습니다 :

A는 집이있다, 그는, B는 집 주소 A, 다음 B 다시 집 주소를 알 주소 B에게와 C에게 이 경우, B와 C는 집 주소 A의 알고 있지만, 실제로 A. 집에 속한 이 때 경우, 가족에 B는 일을했다, 다음 C 이하 같은 일을 찾아 갔다. 그래서 그냥 B를 알고 C는 집 주소, 언제든지 액세스 할 수 있습니다,하지만 정말 고유하지 않습니다.

그래서 우리는 다음과 같은 결론을 가지고 :

위의 설명은 다음을 추론에서, 우리는 다음과 같은 결론을 얻을 수 있습니다 :

(1) 객체 참조는 0 또는 1 주제 (사람이 집의 주소를 알거나 알 수 없습니다)을 가리킬 수 있습니다;

(2) 오브젝트가 그것에 N 참조를 가질 수 (N 개인 집의 주소를 알 수있다).

자바 객체와 관계형 참조는 상호되었다고하지만, 서로 독립적으로 할 수있다. 독립적으로 주로 다른 각 : 기준이 변경 될 수 있고, 이는 다른 개체를 가리킬 수있다.

저장 공간에서 개체 및 참조는 독립적으로, 서로 다른 위치에 저장되는 개체는 일반적으로 힙에 저장되며, 기준은 스택 빠른에 저장됩니다.

다른 객체를 가리킬 수 참조하면, 객체는 참조 조작 복수 일 수있다. 위에서 말했듯이, S1과 S2 두 개체가 동일한 가리 킵니다. 두 참조가 동일한 개체를 가리 때문에, 다음 상관없이 참조 콘텐츠 객체 변경, 단 하나를, (S1)에 의해 자연스럽게 동일한 콘텐츠를 S2에서, 개체를 조작하지 않습니다.

객체와 참조 사이의 관계를 더 이해 한 후, 인수를 찾습니다. 자바는 매개 변수를 전달하는 단 하나의 방법입니다 값에 의해 전달되고, 그 값에 의해 전달되는 자바 전부입니다. 들어오는 방법은 물건의 기본 유형 인 경우,이 기본 타입의 사본을 얻을. 기준을 통과하는 경우, 참조의 사본을 얻을 수 있습니다. :

유사하게, 예를 들어 :

패키지 임시 파일;

공용 클래스 솔루션 {

    파라미터들의 기본적인 유형은 전달 //
    공공 정적 무효 fun1 (INT의 m) {
        m = 100;
    }

    기준치 변경하지 않고 오브젝트 // 파라미터
    공공 정적 무효 Fun2에합니다 (StringBuffer를 S) {
        s.append ( "을 Fun2에");
    }

    기준치 변경 오브젝트 // 파라미터
    공공 정적 무효 FUN3합니다 (StringBuffer를 S) {
        S는 새로운 StringBuffer를 새로운 ( "FUN3는") = 단계;
    }

    공공 정적 무효 메인 (문자열 []에 args) {

        int로 I = 1;
        용액 S1 = 새로운 솔루션 (); 
        에서 System.out.println (I) // I = 1 개
        의 StringBuffer의 SS = StringBuffer를 새로운 ( "메인");

        에서 System.out.println (ss.toString ()); // 메인

        Fun2에 (SS);

        에서 System.out.println (ss.toString ()); // mainfun2

        fun3 (SS);

        에서 System.out.println (ss.toString ()); // mainfun2
    }
}
fun1에서 변수 m의 값이 변화하지만, 상기 결과는, 파라미터 fun1 방법은, 기본 유형이지만 m에 영향을 미치지 않는다.

Fun2에 파라미터 따라서, S의 조작 대상의, SS는 영향의 한 객체에있어서, 상기 파라미터의 SS를 통과 할 때, SS의 복사본을 얻을 수 있으므로 S 및 SS 점이다.

fun3 파라미터 객체 방법이지만 변수가 S SS를 통과 할 때, SS의 복사본을 획득하지만, 물체의 변화는 아무런 관계가없는 S, S 및 SS에게 재 할당에 S를 fun3이 가리키는 다른 개체에 그것 SS 포인트는, 그래서 상관없이 S의 작동, SS는 영향을받지 않습니다.
 

추천

출처blog.csdn.net/qq_28817739/article/details/88431787