2017-11-23 13 views
-2

대비를 설명합니다. 다음 자바 조각 봐 :자바의 해당 클래스의 인스턴스 변수를 사용하여 클래스의 정적 멤버 및 정적 함수에 액세스 할 수 있습니까?

public class Janerio { 
    public static void main(String[] args) { 
     new Janerio().enemy(); 
    } 

    public static void enemy() { 
     System.out.println("Launch an attack"); 
    } 
} 

위의 코드는 매우 잘 작동하고, 출력은 다음과 같이 될 것에 따라이 질문에 대한 대답은 예 것으로 보인다. 이러한 상황이 온다 이유

Launch an attack 

하지만

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

내가 컴파일 타임 오류를 얻을 다음 코드를 실행 바로 다음 순간에

/Janerio.java:3: error: <identifier> expected 
System.out.println(new Janerio().class);} 
           ^
/Janerio.java:3: error: ';' expected 
    System.out.println(new Janerio().class);} 
             ^
2 errors 

나는 보지 않는다 이전 스 니펫에서는 클래스의 인스턴스를 사용하여 정적 "적"기능에 액세스 할 수 있었기 때문에 여기서는 잘못된 것으로 입증되었습니다. 클래스의 인스턴스를 사용하여 ".class"정적 메서드에 액세스 할 수없는 이유는 무엇입니까? ".class"를 정적 함수 또는 Janerio 클래스의 멤버로 간주하는 것이 잘못되었지만 두 조각의 정적 기능과 유사하게 잘못 되었습니까? 하지만 ".class"를 클래스 이름과 함께 호출하자마자 ".class"는 본질적으로 정적이지만 클래스의 인스턴스와 함께 ".class"를 호출 할 때 정적이됩니다.

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

출력 우리가 얻을 :

class Janerio 
+0

.class는 메소드가 아니며 클래스 리터럴을 나타냅니다. 대체로 SO : D에 어딘가에 대한 답이있을 것입니다. – Koekje

답변

0

(class 외에 키워드입니다) : 따라서 그것은 당신의 사용 자세한 내용은 여기를 읽어

적용되지 않습니다.

int.class, Integer.class, java.util.List.class 
0

클래스 Janerio의 정적 기능 또는 구성원이 될 "을 .class"고려하는 것이 내가 잘못 :

이 클래스 이름을 사용할 의사 작업은 클래스의 인스턴스를 산출한다 ?

예, 변수가 아니며 확실히 방법이 아닙니다. 인스턴스의 클래스를 가져올 때 Object # getClass 메서드를 사용해야합니다.

0

그렇습니다. 그렇다면 클래스의 정적 멤버에 액세스 할 수 있지만 더 나은 방법은 해당 클래스의 개체에 대한 특정 참조 이름 대신 해당 클래스의 이름을 사용하는 것입니다. 클래스의 정적 멤버가 특정 객체에 속하지 않고 전체 클래스에 속하기 때문에 코드를 명확하게 이해하고 읽을 수 있습니다.예를 들어

MyClass obj1 = new MyClass(); 
MyClass obj2 = new MyClass(); 
obj1.field = 128; 

때문에 예를 들어, 본 명세서의 이름을 사용하여 해당 값을 변경하는 대신

MyClass.field = 128; 

:

class MyClass { 
    static int count = 0; 
} 

그 방법이 필드를 액세스하는 것이 좋다 이 방법으로도 obj2.field에 128이라는 새로운 값이 할당되었다는 것을 깨닫게되면 혼란 스러울 수 있습니다. 약간 까다로울 수도 있으므로 다시 한 번 제안 된 첫 번째 메토 메소드를 호출하거나 필드에 할당 된 값을 변경하는 것.