2010-01-28 2 views
1

파이썬에서는 클래스 메서드를 상속 할 수 있습니다. 예 :상속 된 클래스 메서드 호출 Java에서

>>> class A: 
... @classmethod 
... def main(cls): 
... return cls() 
... 
>>> class B(A): pass 
... 
>>> b=B.main() 
>>> b 
<__main__.B instance at 0x00A6FA58> 

Java로 어떻게하면됩니까?

public class A{ 
    public void show(){ 
     System.out.println("A"); 
    } 
    public void run(){ 
     show(); 
    } 
    public static void main(String[] arg) { 
     new A().run(); 
    } 
} 
public class B extends A{ 
    @Override 
    public void show(){ 
     System.out.println("B"); 
    } 
} 

내가 B.main()를 호출하고 "B"를 인쇄이 싶지만 분명이 "A"가 아니라, "새 A()"때문에 하드 코드 인쇄됩니다 : 저는 현재 있습니다.

"new A()"를 호출하여 하드 코드 된 클래스 A가 아닌 클래스를 사용하도록 매개 변수가 어떻게 변경 되었습니까?

답변

1

java의 정적 메서드는 이 아니며 staticmethod입니다. 일반적으로 정적 메소드가 호출 된 클래스 참조를 알 수 없습니다.

+0

고마워, 나는 그것을 두려워했다. – Cerin

0

나는 이것이 불가능하다고 생각합니다. 이유는 다음과 같습니다.

Java에서 메소드 구현은 인스턴스의 런타임 유형에 따라 결정됩니다. 그러므로 B.show()을 실행하려면 B의 인스턴스가 있어야합니다. 인스턴스를 생성하는 메소드가 상속되어야한다면, 런타임에 알 수없는 유형의 인스턴스를 생성하기 위해 Class.newInstance()을 사용하는 것이 유일한 방법입니다.

정적 메서드 내에서 해당 클래스에 대한 참조가 없으므로 호출 할 사람이 누구인지 알 수 없습니다.

왜 이렇게하고 싶습니까? 원하는 모든 것을 성취 할 수있는 더 좋은 방법이있을 수 있습니다.

0

예에서 나는 메인 메소드를 A 안에 넣지 않을 것입니다. 이것은 시스템에 진입 점으로 설정됩니다 (A에 특별히 입력하는 경우에는 B에있을 수 없습니다).

아래 예제에서는 클래스 A, B 및 C를 만들었습니다. 클래스 C는 A와 B를 인스턴스화하여 실행합니다. B

희망이 말이 B : C의 I는 I 내 출력 인 B.로서 인스턴스화하는 A하는 B, 및 또 다른 한개 생성 알.

public class A { 
public void show(){ 
    System.out.println("A"); 
    } 

public void run(){ 
    show(); 
    } 
} 

public class B extends A { 
@Override 
public void show(){ 
    System.out.println("B"); 
    } 
} 

public class C { 
public static void main(String[] args) { 
    A a = new A(); 
    B b = new B(); 
    A anothera = new B(); 

    a.show(); 
    b.show(); 
    anothera.show(); 
    } 
} 
1

클래스 Bmain 방법이없는 정적 방법은 상속하지 않습니다.

+1

'B'는'main'을 가지고 있습니다; A에서 물려받은 것. –

+1

정적 메서드가 실제로 상속되지 않도록주의하십시오. – Matt

1

내가 이런 일이 일어나는 것을 볼 수있는 유일한 방법은 A.main(String[] arg)을 호출하는 대신에 B.main으로 전화를 변경하는 것입니다.

B.main : 은

public static void main(String[] arg) { 
     new B().run(); 
    } 

어떻게 프로그램이

을 시작 ? 배치 파일, 바로 가기 등이 있습니까? 너 뭔가 바꿀 수있어? A.main 어디에서 전화가 오나요?

+0

이것은 클래스 B에 자신의 main()을 부여함으로써 효과적으로 수행하고 있습니다.나는 A에서 main()을 상속받을 수 있기를 바랄 뿐이었다. 인스턴스화하는 데 사용 된 클래스가 아닌 다른 클래스와 동일하기 때문이다. – Cerin