2017-09-16 5 views
0

私はJava GUIの電卓を作ろうとしていて、あるクラスが別のクラスを継承するシナリオに違いがあるかどうか疑問に思っていました。クラス。親コンストラクタを呼び出す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();はそれと何か関係があります)、2番目の出力行ではcalculator.Aではなく、コンストラクタのcalleクラスAのd?

EDIT:

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

私には不思議に思うことが1つあります。 classname = new B()、関数h()はAコンストラクタで実行され、どちらも関数h()を持ち、クラスAはAを出力し、クラスBはBを出力します。 Ah()はAのコンストラクタで使用されていますか?新しいB()はAを出力します。私はこれを使うことができず、A()ではsuperを使うことができません。私は静的関数を使うことができることを知っていますが、それが私ができる唯一のことですか?私はJavaにとって非常に新しいですが、Csharpでいくつかの経験があります。 –

+0

私には明らかではない、あなたがちょうど尋ねたもの。それでもAまたはBのインスタンスを参照する必要がある場合は、クラスを作成するか、クラスから静的参照を使用する必要があります。 – nullpointer

関連する問題