2016-08-18 2 views
0

mainメソッドを明示的に指定する代わりに、クラス/抽象クラスを拡張し、そのスーパークラスによって呼び出されるメソッド、例えばinitをオーバーライドするテストプログラムを作成します。mainを拡張クラスでラップする方法はありますか?

私の試み:

JavaApplication.java

public class JavaApplication { 
    public JavaApplication(){ 
     this.init(null); 
    } 

    public JavaApplication(String[] args) { 
     this.init(args); 
    } 

    public void init(String[] args) { 
     /* override me */ 
    } 

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

MyApp.java

public class MyApp extends JavaApplication { 
    @Override 
    public void init(String[] args) { 
     System.out.println("Hello, World!"); 
    } 
}  

コードはコンパイルが、私のinitメソッドが呼び出されない(文字列はありません表示されません)。

Javaでこの動作を定式化する適切な方法は何ですか?

関連質問:

  1. can-i-access-a-subclass-method-through-a-base-class-typed-reference
  2. calling-a-method-of-subclass-through-reflection
  3. whats-wrong-with-overridable-method-calls-in-constructors
  4. calling-an-overridden-method-from-a-parent-class-ctor
+2

**私はMyAppを使用していない**と思われるかもしれません。 –

+0

私はそれを理解していますが、私はそれを表現する方法を理解していないので使用しています。 – Dmitry

+1

メインは1つしかなく、呼び出されるメイン(JavaApplicationで定義されたもの)です。私はそのメインがサブクラス(MyApp)のinitではなく、自分のinitを呼び出すようにしたいが、そうしていないようだ。 – Dmitry

答えて

0

あなたはのインスタンスを作成しますMyAppmainメソッドを追加する必要があります:次に

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

JavaApplicationの代わりにMyAppを実行します。

+0

それは実験の目的を崩壊させます。私の目標は、スーパークラスがサブクラスのinitを呼び出させることです。 – Dmitry

+0

@Dmitry - とにかく問題が起きることに注意してください。 - 'MyApp'はまだ初期化されていません(そのコンストラクタは実行されていません)ので、オーバーライドされたメソッドを基本クラスのコンストラクタから呼び出すと、一般的に場合。 –

+1

@Dmitryは継承の目的に違反します。複数のサブクラスがあるとします。どのサブクラスの 'init'メソッドを呼び出すべきか、スーパークラスはどのように知っていますか? – mapeters

関連する問題