2014-04-24 3 views
-2
class FDemo { 
    int x; 

    FDemo(int i) { 
     x = i; 
    } 

    protected void finalize() { 
     System.out.println("Finalizing " + x); 
    } 

    void generator(int i) { 
     FDemo o = new FDemo(i); 
     System.out.println("Creat obj No: " + x); // this line 
    } 

} 

class Finalize { 
    public static void main(String args[]) { 
     int count; 

     FDemo ob = new FDemo(0); 

     for(count=1; count < 100000; count++) 
      ob.generator(count); 
     } 
    } 
} 

x의 값은 항상 0 (객체 ob의 x 값)을 표시하며, 객체 o의 값을 표시하지 않는 이유는 무엇입니까 ?? 나는 내가 o.x를 사용한다면 객체 o에서 x의 값을 얻는다. 하지만 여전히이 코드에서 오브젝트 o가 아닌 비열한 ob의 가치를 보여주는 이유는 무엇입니까 ??자바에서 객체 생성 및 파이널 지정

+0

Erm, 새로운'FDemo'를 인스턴스화 한 다음 아무 것도하지 않고 버립니다. 정확하게 당신은 무슨 일이 일어나기를 기대합니까? –

+0

'x'를'o'로 보라고 말하지 않았습니다. 'System.out.println ("Create obj No :"+ ox);를 사용하면 원하는 것을 얻을 수 있지만'x'는 현재 객체의'x'를 가리키며'x'는 참조하지 않습니다. 방금 만든 객체입니다. –

+0

'int x'를 'static int x'로 변경하면 효과가 있지만 접근 방식이 잘못되었습니다. 새 인스턴스를 만드는 중 객체 생성 설정 메서드에서 값을 변경하는 경우 – franki3xe

답변

0

방금 ​​작성한 FDemo에서 x를 참조하려면 getX() 함수를 추가하고 x 대신에이를 호출해야합니다 (David Wallace). (나는 .variable 대신 getters를 사용하는 편이 낫다.)

은 수업이 추가 :

public int getX(){ 
    return x; 
} 

그리고이에 문제가있는 줄을 변경 :

System.out.println("Creat obj No: " + o.getX()); 

를 수정해야한다고. 중요한 것은 변수와 메소드가 개인용, 공용 또는 보호용인지 여부를 명시 적으로 선언하는 것이 좋습니다.