2010-02-08 2 views
11
public class CallingStaticMethod { 
public static void method() { 
    System.out.println("I am in method"); 
} 
public static void main(String[] args) { 
    CallingStaticMethod csm = null; 
    csm.method(); 
    } 
} 

누군가 위의 코드에서 정적 메서드가 어떻게 호출되는지 설명 할 수 있습니까?null 객체 참조를 사용하여 정적 메서드를 호출하면 어떻게됩니까?

+24

그 유사한 코드를 작성할 때마다 새끼 고양이가 죽는다 –

+0

@ 퍼지 롤리팝 : :-) @OP : 몇 년 전과 몇 년 전,이 동작으로 인해 물 렸습니다 (열심히 물 렸습니다). 왜냐하면 간단한 표기법을 사용하여 클래스 표기법을 호출하지 않았기 때문입니다. (그래서 나는 인스턴스 메서드를 호출하는 줄 알았는데 그게 문제가 시작된 곳입니다.) 모든 비용을 들이지 않고이 작업을 수행하지 마십시오 (당신이 원한다고 생각하는 것이 아니고, 내 생각에 혼란스러워하는 이유는 무엇입니까? 컴파일에 실패했습니다). –

답변

22

클래스의 인스턴스를 가질 필요가 없기 때문에 컴파일러에 의해 최적화되었습니다. 컴파일러는 기본적으로 그렇게 자신을 수행하는 그것은 또한 일반적입니다

CallingStaticMethod.method(); 

좋은 방법으로

csm.method(); 

을 대체합니다. 심지어 평균 IDE는 인스턴스를 통해 정적 메서드에 액세스하는 방법에 대해 경고합니다, 적어도 이클립스는 여기 않습니다.

+0

나는 그것이 그럴 것이라고 생각하지 않는다. 인스턴스 구문을 사용하여 정적 메서드를 호출 할 수 있습니다. 인스턴스 메서드는 최적화 할 수 있는지 여부에 관계없이 호출 할 수 있습니다. 나는이 특별한 공식화 작업에 약간 놀랐지 만 그것이 의미가 있다고 생각한다. :-) –

+5

정적이기 때문에 항상 컴파일러에 의해 최적화 될 수 있습니다. – Bozho

+0

컴파일러는 여러 가지 방법으로 코드를 최적화하여 더 빠르게 실행할 수 있습니다. 인스턴스가 없으면 힙을 할당하거나 잡을 필요가 없습니다. – BalusC

3

자바를 사용하면 클래스 인스턴스를 사용하여 정적 메서드를 호출 할 수 있지만 호출하는 데 사용 된 인스턴스에서 메서드를 호출하는 것처럼이 허용치를 혼동해서는 안됩니다.

instance.method();

과 동일합니다. Class.method();

+0

예, 질문의 예제를 사용하려면 CallingStaticMethod.method()를 사용하십시오. –

+0

그게 전부 야. 이것에 관해 나의 머리에서 매우 먼 종소리가 울리고 있었다. 나는 그것에 의해 물 렸음을 회상하는 것 같다. (나는 결코 클래스 메소드를 호출하기 위해 인스턴스를 사용하지 않는다.) –

0

글쎄, 여기까지는 괜찮습니다. 정적 메서드는 클래스 A의 개체 인스턴스에서 액세스하지 않습니다. 클래스 이름이나 참조로 호출하면 컴파일러에서 java.lang.Class 클래스의 인스턴스를 통해 호출합니다.

위의 그림에서 각 클래스 (위 그림의 CallingStaticMethod)는 'java.lang.Class'클래스의 인스턴스입니다. 그리고 클래스를 정의 할 때마다 인스턴스는 java.lang.Class로 생성됩니다. CallingStaticMethod = new java.lang.Class();

그래서 'CallingStaticMethod'에서 메서드가 호출되므로 null 포인터 예외가 발생하지 않습니다.

희망이 도움이됩니다.

0

수 있습니다. null 개체를 가진 비 정적 메서드를 호출하는 경우에만 NullPointerException이 throw됩니다. 방법은 정적 인 경우 메소드가 NPE 통해 것 이외의 정적 인 경우는

To know more click here...

1

Java 언어 사양은 참조 GET의 평가 후 폐기하고 정적 방법을 말한다 ... &를 실행합니다 호출됩니다. 정적 메서드를 호출 this 참조를 사용할 때
15.12.4.1. Compute Target Reference (If Necessary)

이 같은 동작입니다. this이 평가되면 버리고 메소드가 호출됩니다.

예제에도 사용자의 예와 비슷한 예제가 있습니다.목표 기준은 호출 모드가 정적이기 때문에 폐기 후 계산되면

이 기준은 널인지 알기 위하여 조사되지 :

class Test1 { 
    static void mountain() { 
     System.out.println("Monadnock"); 
    } 
    static Test1 favorite(){ 
     System.out.print("Mount "); 
     return null; 
    } 
    public static void main(String[] args) { 
     favorite().mountain(); 
    } 
} 
관련 문제