2016-11-21 1 views
1

나는Java 코드 실행의 우선 순위 또는 우선 순위를 설명 하시겠습니까?

public class B { 
     int mB = 5; 

    public int getBValue(){ 
     return mB; 
    } 
} 

public class A { 
    int mA = b.getBValue(); 

    public static void main(String [] args){ 
     B b = new B(); 
     System.out.println(mA); 
    } 
} 

컴파일러는 "기호 B를 찾을 수 없습니다"라는 두 가지 클래스가 있습니다. 그 코드는 먼저 main 메소드에서 실행하고 라인을 순서대로 실행한다는 것을 이해합니다. 그래서 컴파일러가 코드를 읽을 때 먼저 "B b = new B();"으로 간 다음 b가 정의됩니다. 사실입니까? 범위에서 잘못 되었습니까?

제 2 상태 본인은 :

public class B { 
    static int mB = 5; 

    public static int getBValue(){ 
     return mB; 
    } 
} 

public class A { 
    static int mA = B.getBValue(); 

    public static void main(String [] args){ 
     System.out.println(mA); 
    } 
} 

이 상태가 올바르게 작동합니다. Static은 객체 자체가 아니라 클래스 자체에 속합니다. 그래서 모든 정적로드 된 및 프로그램을 실행할 때 초기화됩니다.

그렇다면이 두 주 사이의 핵심은 어디입니까?

+0

'B b = new B();'는 클래스 'A'가 사용할 수있는 변수를 생성하지 않습니다. 그것은 수업의 범위에 있지 않습니다. 이것은'main' 메쏘드를위한 "local"변수 일뿐입니다. –

+0

그래서 우리는 다른 방법과 같은 주요 방법을 다루므로이 방법에 대한 개인 정보는 없습니까? –

+0

'b'에는 전역 범위가 없습니다. 'main' 메쏘드에서만 사용할 수 있으며 _only_는'main' 메쏘드가 끝날 때까지 사용할 수 있습니다. 'main' 메쏘드가 아닌 다른 메쏘드가 있어도'main' 메쏘드에서했던 것처럼'b' 메쏘드를 사용한다고해도'A' 클래스는'b'에 접근 할 수 없습니다 '왜냐하면'b'는 메서드 안의 _local_ 변수이기 때문입니다. –

답변

2

나는 주 코드에서 먼저 코드를 실행하고 줄 다음에 순서대로 코드를 이해합니다.

전적으로 맞습니다. 그러나 main의 변수 (또는 그 밖의 다른 방법)는 class A의 필드 초기화 프로그램에서 사용할 수 없으므로 클래스 컨스트럭터의 일부로 자체 컨텍스트에서 실행됩니다.

는 컴파일러는 코드가 다음 b 그것이

예, bmain의 닫는 중괄호 때까지, 그 범위의 나머지 부분에 대한 즉를 정의된다 사실 정의 될 B b = new B(); 먼저 간다 읽을 때.

그래서이 두 상태 사이의 핵심은?

이 연습에서 벗어나는 교훈은 필드 초기화 프로그램이 정적 필드와 메소드에 자유롭게 액세스 할 수 있다는 것입니다. 메소드의 생성자 매개 변수 및 로컬 변수를 포함하여 다른 어떤 것도 액세스 할 수 없습니다. 또한 매개 변수와 지역 변수는 자체 메서드 외부의 모든 것에 대해 제한이 없습니다. 여기

+0

" A 클래스의 필드 이니셜 라이저와 아무 관련이 없습니다. "이 말은 무엇을 의미합니까? 예를 들어 주시겠습니까? –

+0

@ AndroidAL-Khatib'int mA'는 필드 선언입니다 .b.getBValue() 표현식은 모든 이니셜 라이저는 어디서나 액세스 할 수있는 정적 필드 이외의 액세스 필드 나 변수가없는 자체 컨텍스트에서 실행됩니다. – dasblinkenlight

+0

그래서 컴파일러는 멤버 클래스 선언을 먼저 읽고 초기화 할 때 메서드를 호출합니까? ? –

0

:

public class A { 
    int mA = b.getBValue(); 

    public static void main(String [] args){ 
     B b = new B(); 
     System.out.println(mA); 
    } 
} 

b이고 그것이 main() 방법에서 로컬 변수이므로 A 예를 볼 수없는 것이다. 그 범위는 main() 메소드에서 제한됩니다.
가 보이지하려면 여기

클래스 A에 정적 필드를 선언해야합니다 : 그것은 유효

public class B { 
    static int mB = 5; 

    public static int getBValue(){ 
     return mB; 
    } 
} 

public class A { 
    static int mA = B.getBValue(); 

    public static void main(String [] args){ 
     System.out.println(mA); 
    } 
} 

:이 범위에서 액세스

static int mA = B.getBValue(); 

B.getBValue() 때문이다. 어쨌든 B.getBValue()은 공용 정적 메서드를 의미하며 정의에 따라 공용 정적 메서드에 모든 곳에서 액세스 할 수 있습니다. 정적이기 때문에 어떤 인스턴스도 필요하지 않으며 공개이므로 모든 클래스에서 호출 할 수 있습니다.

+0

감사합니다 (: –