コメントをいただきましたので回答を追記します。
と書けばOKでしょうか?
まず、javaのコンソールプログラムは起動クラスのmain()
メソッドから実行されることになっています。
パッケージが設定されているのでコマンドプロンプトでは下のように実行します。
...\sample\bin>java sample.ClassSample
するとクラスファイルのmainメソッドから実行されるので
下記のソースではClassSample2
のインスタンス化がまず実行されます。
続いて元々のSystem.out.println
数行が実行されます。
さらにパターン1が実行された後、パターン2、パターン3、パターン4が実行されます。
package sample;
public class ClassSample {
@SuppressWarnings("static-access")
public static void main (String[] args) {
ClassSample2 ddd = new ClassSample2();
/* 元の出力処理 */
System.out.println("元の処理");
System.out.println(ddd.tashizan(190,30));
System.out.println(ddd.hikizan(380, 89));
System.out.println(ddd.warizan(900, 40));
System.out.println(ddd.amari(15, 5));
System.out.println("");
/* パターン1 */
System.out.println("パターン1");
ddd.main(new String[]{});
System.out.println("");
/* パターン2 */
System.out.println("パターン2");
System.out.println(ddd.tashizan(1000,30));
System.out.println(ddd.hikizan(100, 20));
System.out.println(ddd.warizan(10000, 40));
System.out.println(ddd.amari(300, 5));
System.out.println("");
/* パターン3 */
System.out.println("パターン3");
(new ClassSample2()).main(new String[]{});
System.out.println("");
/* パターン4 */
System.out.println("パターン4");
ClassSample2.main(new String[]{});
System.out.println("");
}
/* 中略 */
}
クラスを継承していても、継承側(ClassSample2)で、ClassSample2をインスタンス化しなければならない。
継承先(=継承側?)、継承元にかかわらず、staticメソッドじゃない場合、インスタンス化が必要です。
(ClassSampleを継承している)ClassSample2を利用する側でインスタンス化する必要があります。
上の例ではパターン1、3がインスタンス化したClassSample2の持つmain()
メソッドを実行しています。
で、ClassSample2はClassSampleを継承しているので、その中のメソッドが自由に使える、という理解でいいでしょうか?
基本的にはそういう理解でよいのではないでしょうか?
なぜ「基本的には」かというと、修飾子によって動きが大きく変わるからです。
クラスにstatic
をつけることでインスタンス化が「不必要(不可)」が変わったり、
メソッドにprivate
をつけることでそのメソッドが外から利用することが出来なくなったりします。
上記の例ではパターン2がClassSample
を継承したClassSample2
がインスタンス化され、
継承したtashizan()
など4つのメソッドを持っているので利用できることになります。
ちなみにClassSample2
の中でmain()
がstatic
になっているので、
パターン4のような実行もできますし、
public static void main(String[] args)
で定義されているので、コマンドプロンプトから
...\sample\bin>java sample.ClassSample2
の実行もできます。
現状、どちらのクラスもコンストラクタが無いようです。
javaのコンソールプログラムの場合、起動クラスのmain()
メソッドが最初実行されるメソッドです。
そのmain()
の中でClassSample
はインスタンス化されていますが、
ClassSample2
はインスタンス化もされていないですし、
もちろんClassSample2.main()
メソッドも実行されていません。
因みにですがClassSample
の中でClassSample
をインスタンス化していますが、
ここにコンストラクタを追加するとエラーになると思います。
無限にコンストラクタメソッドを実行し続けるようなループに陥るでしょう。
以上、
ご参考になりますでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/14 09:31
2016/03/14 12:39
2016/03/15 04:24