2010-06-30 4 views
4

아마도이 방법을 사용할 수 없다고 생각하지만 도움이 될만한 가치가 있다고 생각했습니다. 나는 다음과 같은 일을 할 :정적 메서드에서 서브 클래스 인스턴스화

public class Super { 
    public static String print() { System.out.println(new Super().getClass().getSimpleName()); } 
    public Super() {} 
} 

public class Subclass extends Super { 
    public Subclass() {} 

    public void main(String[] args) { 
     Super.print(); 
     Subclass.print(); 
    } 
} 

내 희망은() "서브 클래스"를 보여주기 위해 "최고"와 Subclass.print()을 표시 할 Super.print를 얻는 것입니다. 그러나 정적 컨텍스트에서이 작업을 수행하는 방법을 알지 못합니다. 도와 주셔서 감사합니다.

정적 메서드없이이 작업을 수행 할 수 있으며 각 메서드 호출에 클래스를 전달할 수 있다는 것을 잘 알고 있습니다. 많은 하위 클래스에서 여러 가지 정적 메서드를 재정의해야하므로이 작업을 수행하고 싶지 않습니다.

+0

하여이 작업을 수행 할 수 있습니다() 문자열을 반환하거나 무효화하기 위해 서명을 변경 .. FYI 만. –

+0

예제를 확장 Super에 추가했습니다. 나는 원래 그것을 거기에두고 잊어 버리려고했다. – Blacktiger

답변

9

원하는 구현으로 별도의 Subclass.print() 메서드를 정의 할 수 있습니다. 정적 메소드는 클래스 스코프이므로 모든 서브 클래스는 자체 구현을 가질 수 있습니다. 코드가 다소 단순화 할 수 있습니다

public class Subclass { 
    public Subclass() {} 
    public static String print() { 
     System.out.println(Subclass.class.getSimpleName()); 
    } 

    public void main(String[] args) { 
     Super.print(); 
     Subclass.print(); 
    } 
} 

주 - Super.class 대신 new Super().getClass()의 충분하다. 항상 각 클래스의 메소드를 호출 Super.print()Subclass.print() -

또한 정적 메서드는 다형성하지 을 것을주의. 이것이 그들이 객체가 아닌 클래스에 바인딩 된 이유입니다.

클래스 계층이 큰 경우 각각에 고정 된 print()을 구현하여 많은 중복 코드가 생성 될 수 있습니다. 대신, 당신은 일을 하나의 비 정적 방법을 정의 할 수 있습니다 :이 방법도 다형성 할 필요가 없다는 것을

public abstract class Super { 
    public final String print() { 
     System.out.println(this.getClass().getSimpleName()); 
    } 
    ... 
} 

주 - this.getClass() 항상 실제 서브 클래스 토큰을 반환합니다.

Superabstract으로 선언했음을 유의하십시오. 이는 (거의 항상) 기본 클래스를 따르는 것이 좋습니다. 이 인쇄()를 호출 및 인쇄를 할 수 있도록

+0

이것은 좋은 대답이지만 불행히도 내가 해결하기를 희망하는 문제를 실제로 해결하지는 못합니다. 나는 자바에 실제 해결책이 있는지 확신하지 못한다. – Blacktiger

0

당신은 당신이 서브 클래스는 슈퍼를 확장해야 할 수 있습니다 밖으로 사용하여 정적 메소드

public class Parent { 
    public print(){ 
    System.err.println(this.getSimpleName()); 
    } 
} 

public class Child extends Parent { 
    public void main(String[] args) { 
    Parent p = new Parent(); 
    p.print(); 
    Child c = new Child(); 
    c.print(); 
    } 
} 
관련 문제