2010-05-18 2 views
3

왜 다음과 같은 프로그램이 0을 반환하지 않습니다?액세스 변수 내가 호출 <strong>주요</strong>을 가지고 있지 않은 <strong>새로운 A()</strong>에서 <strong>페이지</strong>에 접근하고 있기 때문에

public class A { 

     public static int p = 0; 

     public static void main(String[] args) { 

       p = Integer.parseInt(args[0]); 
       new B().go(); 

      } 

     } 


     class B { 
      public void go() { 
       System.out.println(new A().p); 
      } 
     } 
+0

출력은 무엇입니까? 오류가 있습니까? –

+0

컴파일되지 않습니다. p는 멤버 변수이고, main은 정적 메서드입니다. – karoberts

+0

유효한 것으로 보이는 질문을 여기에 게시 해보십시오. 나는 당신이 프로그램이 처음 컴파일되는지 여부를 확인하려고 시도조차하지 않았다고 가정합니다. – Thunderhashy

답변

2

컴파일 할 필요가 없습니다.

아마도 너는 p을 정적으로 변경하고 변경했을 가능성이 있습니다. 지금 쓰여진 방식대로 컴파일되지 않습니다.

$ javac A.java 
A.java:7: non-static variable p cannot be referenced from a static context 
      p = Integer.parseInt(args[0]); 
      ^
1 error 
편집 이제 답이 코드를 수정했다고

:

이 프로그램은 당신이 참조하는 값이 0 때문에 인쇄되지 않습니다 이 경우에 p은 클래스 변수입니다.

p = Integer.parseInt(args[0]); 

그래서 당신이 실행할 때 :

System.out.println(new A().p); 

그리고 당신은 "새로운 A"를 생각 0를 볼 것으로 예상 p의 그것을 자신의 복사본을 가지고 있지만 사실이 아니다 것입니다.

+0

전화하세요. 원래 코드 p는 정적입니다. 아마도 그 문제를 해결할 것입니다. – George

+0

이 질문은 삭제 하겠지만 할 수는 없습니다. – George

+0

@George : 인수로 '0'으로 실행하면 '0'이 출력됩니다.) –

0

정적 메소드의 인스턴스 멤버를 지정하려고하므로 컴파일하지 않아야합니다.

0

이 프로그램은 컴파일되지 않습니다. 컴파일러는 클래스 A의 기본 메소드 내에서 'p'에 액세스하게하지 않습니다. 정적 컨텍스트 내에서 비 ​​정적 변수에 액세스 할 수 없습니다. 따라서 컴파일 문제

+0

변수 'p'를 정적으로 정의하더라도 여전히 런타임 예외 '예외 스레드 "주"에서 java.lang.ArrayIndexOutOfBoundsException : 0' – Thunderhashy

+0

아마 당신이 인수와 코드를 호출하지 않기 때문에? –

0

그게 그대로 컴파일되지 않습니다, 그래서 어떻게 반환할지 모르겠다.

변수 p는 정적 컨텍스트에서 액세스 할 수 없습니다.

p의 인스턴스를 설정하면 올바르게 작동합니다.

ps. 이 한 번의 실험에서는 공개되지 않은 최종 구성원 변수를 갖도록하겠습니다. 그러나 결코 다시는 알 수 없습니다!

0

편집 :이 질문의 첫 번째 개정을 기반으로 그냥 추측, p는 비 정적이라고 가정합니다. 그 의도는 정적이라는 것이 밝혀 지므로 스틱의 끝이 잘못되었습니다. 컴파일러 오류에도 불구하고

, 당신의 의도가 아닌 정적 메서드에서 페이지를 초기화하는 것이었다, 또는 A의 인스턴스에 가정

문제는 당신이 B에서의 새로운 인스턴스를 생성하는 것이 다음이다 원래 인스턴스를 사용하지 않습니다.

는 B의 이동() 메소드는 매개 변수로 걸리는

public class A { 

     public int p = 0; 

     public static void main(String[] args) { 
       A a = new A(); 
       a.p = Integer.parseInt(args[0]); 
       new B().go(a); 
     } 

    } 


     class B { 
      public void go(A a) { 
       System.out.println(a.p); 
      } 
     } 

주 같은 것을 할, 당신이 원하는 (내가 믿는) 무엇을 얻을합니다. A의 새로운 인스턴스가 생성되지 않습니다.

관련 문제