Java入門:第13回 親クラスのメソッドの実行とstaticメソッドの実行


親クラスのメソッドの利用

前回は主に継承とオーバーライドについて解説しました。実際のAndroidプロジェクト生成されるコードには次のような記述があります。

           setContentView(R.layout. activity_main);

いきなりsetContentView()といメソッドが出てきます。このメソッドはコンテンツ(Cntent)の見た目(View)をセットするということで画面をセットしているということはなんとなく理解できると思うのですが、なぜこのメソッドが利用できるのは余り詳細に説明がないまま話が進むことが多いです。そこで模擬的に作成しているクラスを修正し、このsetContentView()メソッドを実装してみましょう。

public class MyAppActivity extends Activity{
      void onCreate() {
            super.onCreate();
            setContentView( "私の画面の見た目" );
     }
}

すると当然、setContentView()メソッドは定義されていないので、コンパイルエラーとなります。なぜ実際のAndroidプロジェクトではこのsetContentView()メソッドが記述できるかというと、これはActivityクラスに定義されているメソッドを利用しているからなのです。模擬的なActivityクラスにsetContentView()メソッドを追加してみましょう。

Activity.java
public class Activity {
     String message = "こんにちは";
      void setContentView(String msg) {
           System. out.println( "画面をセットしました=" + msg);
     }
//~略~

mainメソッドが記述されているHelloクラスから呼び出すと次のように表示されます。

Hello.java
public class HelloWorld {
      static public  void main(String [] args) {
           Activity actA = new MyAppActivity();
           actA. message = "おはようございます" ;
           actA.onCreate();
     }
}
onCreateです
おはようございます
画面をセットしました=私の画面の見た目

このように、継承を行うことによって、
1. メソッドを再定義(オーバーライド)しもともとある動作を変更する
2. 親クラスのメソッドを利用する
の2つを行うことができるようになります。

staticメソッドの利用

ところで、Androidアプリケーションの開発ではログを利用してアプリケーションの動作を確認することができます。例えば次のように記述します。

            Log.d( "TAG", "ここが実行されました" );

これはActivityクラスのメソッドではなくて、Logクラスのd()というメソッドを実行しているのです。そこでLogクラスを作成してd()メソッドを実装してみましょう。

Log.java
public class Log {
      void d(String tag, String msg) {
           System. out.println( "tag=" + tag + ":メッセージ=" + msg);
     }
}

Logクラスを作成し、d()メソッドを作成したのですが、エラーが解消されません。Javaでは別のクラスのメソッドを実行する場合は、オブジェクトを生成してから実行しなければなりません。次のように記述する必要があるはずです。

MyAppActivity.java
public class MyAppActivity extends Activity{
      void onCreate() {
            super.onCreate();
           setContentView( "私の画面の見た目" );
           Log log1 = new Log();
           log1.d( "目印" , "出力したいメッセージ" );
     }
}

オブジェクトは複数生成可能ですから、次のようにも記述可能です。

           Log log1 = new Log();
           log1.d( "目印" , "出力したいメッセージ" );
           Log log2 = new Log();
           log2.d( "目印" , "出力したいメッセージ" );      

しかし、出力される結果は共に

tag=目印:メッセージ=出力したいメッセージ
tag=目印:メッセージ=出力したいメッセージ

となります。実際のAndroidプロジェクトではLogCatにメッセージが出力されるだけになります。この場合、オブジェクトをわざわざnew演算子で生成しなくても問題ないように思います。このようなときはメソッドにstatic修飾子をつけるとクラス名を利用してメソッドを実行できるようになります。staticとは静的なという意味で、クラスそのものに属するメソッドになります。

Log.java
public class Log {
      static void d(String tag, String msg) {
           System. out.println( "tag=" + tag + ":メッセージ=" + msg);
     }
}

とstaticを付加すると、次のように呼び出すことができます。staticはメソッドの他にフィールドに付加することもできます。

           Log. d("目印" , "出力したいメッセージ" );

つまり、クラス名(たいてい大文字で始まる単語)の後にピリオドが続き場合は、そのクラスに属しているメンバ(メソッドやフィールド)にstaticにアクセスしていることになります。

まとめると

  1. 継承している場合、親クラスのメソッドを実行することができる
  2. staticなメソッドはオブジェクトを実行することができる

となります。逆に言うと、上記以外はオブジェクトの生成が必要になるということになります。そして、オブジェクトの生成は基本的にnew演算子を利用して生成します。