HelloAndroid.javaとは
HelloAndroid.javaは、以下のように、ごく短いソースコードですが、Java言語特有のキーワードが多く含まれていますので、Javaに不慣れな方には理解しにくいソースかもしれません。まずはこのファイルから、1行ずつソースを追いながら、文法的なキーワードを説明していくことにします。
package codezine.androidjava.chap1; // (1) import android.app.Activity; // (2) import android.os.Bundle; // (3) public class HelloAndroid extends Activity { // (4) ~中略~ }
パッケージとインポート(package、importキーワード)
(1)行は、パッケージ(package)の宣言です。パッケージとは、複数のソースファイルをフォルダごとにまとめる機能です。まとめられたファイルの持つ意味が分かりやすくなり、またクラス名の衝突を避けることができます。
(2)、(3)行は、インポート(import)宣言です。インポート宣言すると、他のパッケージにあるクラスなどを利用する際に、クラス名だけの省略した形で参照できるようになります。インポート宣言をしない場合、他のパッケージにあるクラスを指定するには、パッケージ名から記述します。
android.app.Activity、android.os.Bundleは、それぞれAndroid SDKに含まれるandroid.appパッケージのActivityクラス、android.osパッケージのBundleクラス、という意味です。
クラス(classキーワード)
(4)行めからはクラスのソースコードになりますが、とても短いコードになっています。なぜこれだけでよいのか、カラクリはおいおい説明することにして、まずはクラスの基礎からおさらいしましょう。
オブジェクト指向言語であるJavaのプログラムは、クラスという単位で構成されています。オブジェクト指向では、この世界に存在するあらゆるものを抽象化して、それをオブジェクトという概念でとらえます。クラスは、そのオブジェクトをプログラムとして表現したもので、一連のデータと関連する処理をひとまとめに定義したものです。
クラスのデータ部分をフィールドと呼び、変数や定数となります。また定義した処理をメソッドと呼びます。クラス定義の基本構文は、次のようになります。
アクセス修飾子 class クラス名 { アクセス修飾子 フィールド定義 アクセス修飾子 メソッド定義 }
アクセス修飾子
クラス定義にあるアクセス修飾子とは、外部からのアクセスを制御するための修飾子で、次のキーワードが指定可能です。
アクセス修飾子 | アクセス可能なもの |
private | 同じクラス |
なし | 同じパッケージ |
protected | 同じパッケージまたはサブクラス |
public | 任意のクラス |
アクセス修飾子は、オブジェクト指向の3つの概念の一つ、「カプセル化」を具現化するためのものです。カプセル化とは、クラス内の仕様や構造を外部から隠蔽し、外部に公開された手段でしかデータの操作を許さないようにすることです。クラスの独立性が高まることから、そのクラスをさまざなプログラムで再利用しやすくなります。
HelloAndroidクラスの定義
では、あらためて(4)行めから定義しているHelloAndroidクラスを見てみましょう。
public class HelloAndroid extends Activity { // (4) /** Called when the activity is first created. */ // (5) @Override // (6) public void onCreate(Bundle savedInstanceState) { // (7) super.onCreate(savedInstanceState); // (8) setContentView(R.layout.main); // (9) } }
クラスの継承
(4)は、extendsキーワードを使った継承になっています。Javaでは、定義したクラスを引き継いで、新しいクラスを作成(継承)できます。継承もオブジェクト指向の3つの概念の一つで、もとのクラスに新しく必要となるデータやメソッドを追加したり、メソッド内容を変更したりするものです。
継承する、もとのクラスをスーパークラスや親クラス、継承したクラスをサブクラス(派生クラス) や子クラスと呼び、extendsキーワードを使って次のように定義します。
class サブクラス名 extends スーパークラス名 { クラス定義 }
つまり、HelloAndroidクラスは、Android SDKのandroid.appパッケージにあるActivityクラスを継承したサブクラスということです。また、アクセス修飾子にpublicを指定しているので、どのクラスからでも呼び出せます。
Activityクラス
HelloAndroidクラスのもとになっているActivityクラスは、Android SDKで定義されているクラスで、Androidの「アクティビティ」を定義したクラスです。
アクティビティとは、Androidアプリケーションの基本となるコンポートネントのことで、Windowsアプリケーションでいえばウインドウオブジェクトに相当します。通常は、ユーザーインターフェースとなる画面ごとに、Activityクラスのサブクラスを定義します。複数の画面を持つアプリケーションでは、複数のアクティビティから構成されます。
Activityクラスのサブクラスは、Androidアプリケーションでは、少なくとも1つは必要となります。アプリケーションが起動されると、まず指定されたActivityサブクラスのオブジェクトが、Androidのフレームワークによって生成されます。
アクティビティの基本処理は、Activityクラスですでに定義されています。従ってそれぞれのアプリケーションでは、Activityクラスを継承したサブクラスに、必要な部分のみ記述すればよい、ということになります。
オーバーライドアノテーション(@Overrideキーワード)
(5)行はコメントですが、(6)行はそうではありません。このような@から始まるキーワードをアノテーション(注釈)と呼びます。アノテーションは、コメントと同様にプログラムの動作には影響を与えませんが、おもにコンパイラに情報を通知するために用います。
(6)行の@Overrideは、オーバーライドアノテーションといい、@Overrideの直後に記述したメソッドが、オーバライドしたメソッドであることをコンパイラに通知します。
オーバライドとは、クラスを継承した際に、スーパークラスで定義されたメソッドを、同じメソッド名と引数で上書きすることです。
オーバライドの定義には、特別なキーワードは不要です。そのため、オーバライドのつもりがちょっとしたプログラマのミスで、異なるメソッドの定義になってしまうこともあります。そのようなミスを防ぐのに、(6)行の@Overrideキーワードは役に立ちます。@Overrideがあれば、引数などを間違えて、オーバライドになっていない場合には、エラーとして検出できます。
オーバーライドの意味
(7)行からは、@Overrideが示すように、オーバーライドしたonCreateメソッドの定義で、ActivityクラスのonCreateメソッドの内容を上書きしています。
オーバーライドの効能は、複数のサブクラスを定義した場合に、呼び出し方法を共通としたまま、特定のサブクラスのみ処理内容を変更することができる、というものです。
従ってここでは、Activityクラスのサブクラスで共通のonCreateメソッドを、アプリケーション独自の処理に置き換えている、ということになります。