Pass by What ?

자바 에서 값 형식 과 인용 유형 이 어떻게 전달 되 는 지 오늘 이야기 하 겠 습 니 다.
    이 화제 에 대하 여 나의 한 친구 의 추천 으로 글 한 편 을 보 았 는데,이것 이 야 말로 나 로 하여 금 이 글 을 쓸 생각 을 하 게 하 였 다.이 글 은'Pass-by-Value Please'(Pass-by-Value Please)(http://www.javaranch.com/campfire/StoryPassBy.jsp)가 는 김 에 여러분 께 사 이 트 를 추천 합 니 다.바로...http://www.javaranch.com 아주 좋 은 자바 낙원 입 니 다.
    자,본론 으로 돌아 가자~또 멀리 도망 가지 않 게~ㅋ
   값 유형 에 대해 서 는 모두 가 잘 알 고 있 을 것 이 라 고 생각 합 니 다.전체적으로 말 하면 Copy the value and give it to you 입 니 다.
    다음 코드 를 보십시오.

 package blog.nichlas.article.j2se;

 import static java.lang.System.out;
  
 public class PassByValue {
     public static void testPassValue(){
         int a = 2 ;
         int b = a ;
         out.println("a= " + a ) ;
         out.println("b= " + b ) ;
         out.println("=============== the value has changed ===============");
         a = 3 ;  // has change the value of a, but tht value of b is never be changed
        out.println("a= " + a ) ;
        out.println("b= " + b ) ;
     }
    
     public static void main(String [] args){
         out.println();
         PassByValue.testPassValue();
     }
 }

결 과 는 다음 과 같다.
a= 2
b= 2
=============== the value has changed ===============
a= 3
b= 2
이 예 는 매우 뚜렷 하 다.너무 많은 설명 을 하지 않 아 도 된다.a 와 b 는 이미 두 개의 독립 적 이 고 상호 보완 적 인 가치 이다.
다음은 인용 유형 에 대한 오늘 의 중점 으로 들 어 갑 니 다.
제 가 처음에 언급 한 그 글 을 참고 하고 싶 습 니 다.그 안에 언급 된 컵,I like the cap,do you?
여기 서 예 를 들 어 우리 컵 에 있 는 참조 Reference 를 유사 하 게 만 들 고 싶 습 니 다.운영 체제 에서 중요 한 개념 이 있 습 니 다.그것 은 바로 프로 세 스 제어 블록 입 니 다.그 는 프로 세 스 실체의 일부분 이 고 운영 체제 에서 가장 중요 한 기록 형 데이터 구조 입 니 다.그 는 운영 체제 에 필요 한 것 을 기록 하 였 습 니 다.프로 세 스 의 현재 상황 과 프로 세 스 실행 을 제어 하 는 모든 정 보 를 설명 합 니 다.인용 도 마찬가지다.다만 이렇게 복잡 하지 않 을 뿐이다.인용 에 자바 object 관련 정 보 를 저장 하여 JVM(Java Virtual Machine)이 더미 에서 대상 을 찾 을 수 있 도록 합 니 다(자바 대상 이 모두 더미 에 있 습 니 다).
우 리 는 이러한 상황 을 하나의 컵 에 프로 세 스 제어 블록 과 유사 한 reference 를 넣 었 다 고 상상 할 수 있 습 니 다.다음은 다음 코드 를 보 겠 습 니 다.
 

  package blog.nichlas.article.j2se;
  
  import static java.lang.System.out;
  
  public class PassByValue {
      public static void testPassValue(){
          int a = 2 ;
          int b = a ;
          out.println("a= " + a ) ;
          out.println("b= " + b ) ;
          out.println("=============== the value has changed ===============");
          a = 3 ;  // has change the value of a, but tht value of b is never be changed
          out.println("a= " + a ) ;
          out.println("b= " + b ) ;
      }
     
      public static void testPassReference(){
          ObjectForTest o1 = new ObjectForTest("Object one");
          ObjectForTest o2 = o1;
          out.println(o1.getInfo());
          out.println(o2.getInfo());
          out.println("=============== the value has changed ===============");
          o1 = new ObjectForTest("Object two");
          out.println(o1.getInfo());
          out.println(o2.getInfo());
      }
     
      public static void main(String [] args){
          out.println();
          PassByValue.testPassValue();
          out.println();
          PassByValue.testPassReference();
      }
  }
 
  class ObjectForTest{
      String info ;
         
      public ObjectForTest(){
          info = "default";
      }
         
      public ObjectForTest(String initInfo){
          info = initInfo ;
      }
         
      public String getInfo(){
          return info;
      }
          
      public void setInfo(String changeInfo){
          info = changeInfo;
      }
  }

실행 결 과 는:
a= 2
b= 2
=============== the value has changed ===============
a= 3
b= 2
Object one
Object one
=============== the value has changed ===============
Object two
Object one
여기 서 이른바 Reference 는 사실 값 유형 과 매우 비슷 하 다 는 것 을 뚜렷하게 나 타 낼 수 있 기 때문에 우 리 는 Reference 에'인용 값'이라는 이름 을 지어 줄 수 있다.
여 기 는 o1 의 인용 치 를 o2 에 복사 한 것 입 니 다.
그러나 여기 서 주의해 야 할 것 은 인용 값 의 복사 이지 만 그들 은 같은 대상 을 인용 하여 모든 대상 에 대한 변 화 는 다른 인용 에 나타 날 수 있다 는 것 이다.
다음 과 같은 예 를 보십시오.

 package blog.nichlas.article.j2se;
 
 import static java.lang.System.out;
 
 public class PassByValue {
     public static void testPassValue(){
         int a = 2 ;
         int b = a ;
         out.println("a= " + a ) ;
         out.println("b= " + b ) ;
         out.println("=============== the value has changed ===============");
         a = 3 ;  // has change the value of a, but tht value of b is never be changed
         out.println("a= " + a ) ;
         out.println("b= " + b ) ;
     }
     
     public static void testPassReference(){
         ObjectForTest o1 = new ObjectForTest("Object one");
         ObjectForTest o2 = o1;
         out.println(o1.getInfo());
         out.println(o2.getInfo());
         out.println("=============== the value has changed ===============");
         o1 = new ObjectForTest("Object two");
         out.println(o1.getInfo());
         out.println(o2.getInfo());
     }
     
     public static void testChangeObject(){
         ObjectForTest o1 = new ObjectForTest("Object one");
         ObjectForTest o2 = o1;
         out.println(o1.getInfo());
         out.println(o2.getInfo());
         out.println("=============== the value has changed ===============");
         o1.setInfo("Object Value changed!");
         out.println(o1.getInfo());
         out.println(o2.getInfo());
     }
     
     public static void main(String [] args){
         out.println();
         PassByValue.testPassValue();
         out.println();
         PassByValue.testPassReference();
         out.println();
         PassByValue.testChangeObject();
     }
 }
 
 class ObjectForTest{
     String info ;
         
     public ObjectForTest(){
         info = "default";
     }
         
     public ObjectForTest(String initInfo){
         info = initInfo ;
     }
         
     public String getInfo(){
         return info;
     }
         
     public void setInfo(String changeInfo){
         info = changeInfo;
     }
 }

결 과 는 다음 과 같다.
a= 2
b= 2
=============== the value has changed ===============
a= 3
b= 2
Object one
Object one
=============== the value has changed ===============
Object two
Object one
Object one
Object one
=============== the value has changed ===============
Object Value changed
Object Value changed
여기 서 볼 수 있 듯 이 o1 대상 의 변 화 는 o2 에 나타 나 고 o2 에 대한 호출 을 통 해 알 수 있다.
이상 은 제 가 이 문제 에 대한 생각 입 니 다.여러분 이 좀 도와 주 셨 으 면 합 니 다.

좋은 웹페이지 즐겨찾기