2012-06-07 2 views
3

나는 슈퍼 클래스 Vehicle을 가지고 있으며 서브 클래스는 PlaneCar입니다. 차량은 final string name; 필드가있는 클래스에서 확장되며 생성자에서만 설정할 수 있습니다.슈퍼 생성자를 호출하고 클래스 이름을 java로 전달할 수 있습니까?

이 필드를 클래스 이름으로 설정하려고합니다. 따라서 Car의 이름은 Car, Plane은 Plane, Vehicle은 Vehicle이됩니다.

public Vehicle() { 
    super(getClass().getSimpleName()); //returns Car, Plane or Vehicle (Subclass' name) 
} 

을하지만이 나에게 오류를 제공합니다 : 우선 나는 생각했다 Cannot refer to an instance method while explicitly invoking a constructor.

수동으로 문자열로 전달하지 않고도 name 필드를 클래스 이름으로 설정할 수 있습니까?

+0

왜? 클래스는 언제든지 자체 이름을 가져올 수 있으며 필드에 저장할 필요가 없습니다. – EJP

답변

6

그렇게하지 않아도됩니다.

getClass().getSimpleName()을 기본 생성자에서 직접 호출 할 수 있습니다. 컴파일러가 말했듯

+0

이 문제는 API (Libgdx 라이브러리)의 일부이기 때문에 기본 클래스를 수정할 수 없다는 것입니다. 이름 String은 생성자를 통해 전달되어야하며 더 이상 쓰기 액세스가 없습니다. – user717572

+0

글쎄,이게 내 질문에 가장 잘 답하는 것 같아. 심지어 내 상황에는 적용되지 않는다. 이제 문자열을 수동으로 전달합니다. – user717572

1

또한이

//Vehicle constructor 
    public Vehicle() { 
     super(Vehicle.class.getSimpleName()); 
    } 

    //Plane constructor 
    public Plane(){ 
     super(Plane.class.getSimpleName()); 
    } 
+0

이것은 항상 "Vehicle"을 반환하고 가능한 Subclass의 이름은 반환하지 않습니다. – user717572

+0

각 하위 클래스 생성자에 하위 클래스 이름을 넣습니다. 나는 그 대답을 편집했다. – Averroes

+0

하지만 그건 내가 원하지 않는 것입니다. 모든 이름을 수동으로 정의해야합니다. getSimpleName이 너무 좋아서 실제 서브 클래스 이름을 얻었 기 때문에 수퍼 클래스에서 한 번 호출 할 수 있었고 '실제'객체 유형 만 가져올 수있었습니다. – user717572

0

을 수행 할 수 있습니다, 당신은 "슈퍼()"메소드의 호출의 일부로서 인스턴스 메소드를 호출 할 수 없습니다.

그러나 정적 메서드를 호출 할 수 있습니다. 또한 슈퍼 생성자 코드 자체에서는 항상 "getClass()"를 호출 할 수 있으며 실제 인스턴스 유형을 반환합니다.

public class A { 
    public A() { 
     System.out.println("class: " + getClass().getName()); 
    } 
} 

public class B extends A { 
    public B() { 
     super(); 
    } 
} 

new A(); --> "class: A" 
new B(); --> "class: B" 
관련 문제