2017-09-16 1 views
0

그래서 Java GUI 계산기를 만들려고하고 있는데 한 클래스가 다른 클래스를 확장하는 시나리오에서 차이가 있을지 궁금해지기 시작했습니다. 확장 된 함수에서 functionname 대신 super.functionname을 호출합니다. 수업.부모 생성자를 호출 Java

class frame extends JFrame{ 
     public buttonframe(){ 

     // any difference between this.add.. or super.add.. 

     } 
} 

나는 몇 가지 실험을하기 위해 몇 가지 수업을 만들었으며, 나는 꽤 이해하지 못하는 것을 발견했다.

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

    public void h(){  
     String className = this.getClass().getName(); 
     System.out.println(className); 
    } 
} 

class B extends A{ 
    public B(){ 
     System.out.println("B"); 
     h(); 
    } 
} 

은 실행 :

public static void main(String[] args){ 
    new A(); 
    new B(); 
} 

출력 생성합니다 :

> A calculator.A 
> A calculator.B 
> B calculator.B 

내가 확장 클래스는 부모 클래스의 생성자를 호출 것이라는 점을 알고있다, 그러나 왜 결과 계산기를 생산 않습니다 .B (비록 내가 왜 이것을해야하는지 모르겠지만, A classname = new B();은 그것과 관련이 있다고 가정한다.) calculator.A 대신에 두 번째 출력 라인에서 생성자 인 calle 클래스 A에서 d?

편집 :

class A{ 
public A(){ 
    //Can I instantiate a new B() and somehow ouput "A"? 
//I can do it using A.hs(); but can I do it: 

//Using the method h() but with a specific keyword infront of h() so 
//that it always refers to the method h() of the class A. 
h(); 
} 
public static void hs(){ 
System.out.println("A"); 
} 
    public void h(){ 
    System.out.println("A"); 
    } 
} 

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

답변

1

결과 때문에 문이다

String className = this.getClass().getName(); 

new B()이라 현재 오브젝트 (this)은 B 및 B의 때문에 클래스 이름이다.


따라서, 귀하의 경우와 전체 순서가 될 것이다 : 나는 생각하면 이해가 않습니다

A() => prints A => call h() with current object of 'A' => prints classname of A 

B() => calls super c'tor A() => prints A => call h() with object of 'B' 
    => prints classname of B => prints B => call h() => prints classname of B 
+1

. 나는 내가 "이 클래스를 충분하게 확장하지 못했다"는 것을 깨닫는다. 왜냐하면이 키워드를 사용할 때마다 같은 클래스 내에서만 사용되기 때문에 this 키워드를 오브젝트 자체 대신 클래스와 연관시키기 시작했다. –

+0

내가 궁금해하는 한 가지가 있습니다. A 클래스가 A를 인쇄하고 B 클래스가 B를 인쇄하는 classname = new B()는 A() 생성자에서 h() 함수가 실행되고 두 함수 모두 h()를가집니다. Ah()는 A의 생성자에 사용됩니까? 그래서 새로운 B()가 A를 출력 할 것입니다. 저는 이것을 사용할 수 없으며 A()에서 super를 사용할 수 없습니다. 나는 정적 함수를 사용할 수 있다는 것을 알았지 만 내가 할 수있는 유일한 것인가? 나는 Java에 익숙하지 만 Csharp에서 약간의 경험이있다. –

+0

방금 ​​물었던 것, 나에게 분명하지 않다. A 또는 B 중 하나의 인스턴스를 참조해야 할 경우 클래스를 만들거나 정적 참조를 사용해야합니다. – nullpointer