2009-10-09 6 views
0
Case:1 

    class A 
    { 
     private int i=0; 

     public void display() 
     { 
      this.getValue(); 
     } 

     private int getValue() 
     { 
      return i+2; 
     } 

    } 

Case:2 

    class B 
    { 
     public void display() 
     { 
      int i=0; 
      this. getValue(i); 
     } 

     private int getValue(int i) 
     { 
      return i+2; 
     } 
    } 

display()를 호출 할 때마다 두 경우 모두 "i"선언이 큰 차이 (글로벌 액세스 제외)가 있습니까?변수 선언?

+0

사용중인 언어에 대해 언급하고 싶을 수 있습니다. 대답은 아마도 C/C++/C#/Java 제품군에서 동일 할 것이지만 그렇지 않을 수도 있습니다. – ctford

답변

2

이 경우 효과는 동일하지만 첫 번째 스 니펫의 클래스 인스턴스가 더 많은 메모리를 차지합니다.

첫 번째 경우와 다른 점은 각 호출마다 동일한 주소를 사용하는 변수이며 값을 유지하지만 두 번째 경우에는 반드시 동일한 주소의 변수가 아니며 각 호출에서 다시 할당되고 다시 초기화됩니다. .

실제로 변수 값을 i으로 변경하지 않으므로 const으로 선언해야합니다. 이렇게하면 더 명확한 코드가 제공됩니다. 첫 번째 경우에서 i

+0

이것이 자바 인 경우를 제외하고는'const'가 존재하지 않습니다. – Jesper

+0

Java에서 'final'도 같지 않습니까? – sharptooth

0

display()는 메소드가 호출 될 때에 만 존재하는 경우 제 i 어떤 방법

밖에 존재한다. 지속성을 부여하려면 static으로 선언 할 수 있습니다.

+0

이것이 Java 인 경우를 제외하고는 로컬 정적 변수가 존재하지 않습니다. – Jesper

2

첫 번째 경우 i는 객체의 일부입니다. 클래스 A에서 객체를 만들면 객체는 변수 "i"에 대한 메모리를 할당합니다. 그리고 개체가 삭제 될 때까지 남아 있습니다.

그러나 두 번째 방법으로 클래스 B에서 개체를 만들 때 변수 i에 대한 메모리 할당이 없습니다. 하지만 디스플레이 함수를 호출 할 때만 - 클래스 B - 메모리 변수 "i"는 일시적으로 할당됩니다. (함수의 작업이 완료되면 모든 지역 변수가 해제됩니다)