 |
|
前のページ 1 2 3 次のページ
|
 |
staticとインスタンス
|
変数やメソッドの種類はどこに紐づいているかによって意味が変わります。staticな変数やメソッドはクラスに紐付けられており、インスタンス変数やインスタンスメソッドはオブジェクトに紐付けられています(図2)。

図2:クラスとインスタンスの紐付け (画像をクリックすると別ウィンドウに拡大図を表示します)
メソッドの種類によってアクセスできる変数やメソッドが決められています(表2)。
|
static 変数に アクセス |
インスタンス 変数に アクセス |
static メソッドに アクセス |
インスタンス メソッドに アクセス |
static メソッド |
○ |
× |
○ |
× |
インスタンス メソッド |
○ |
○ |
○ |
○ |
表2:メソッドの種類とアクセス可能範囲
「インスタンス」はオブジェクトのことで、メモリ上にオブジェクトを生成することを「インスタンス化する」といいます(Javaプログラムではnewキーワードを使用します)。
Javaを覚えたての人は、いちいちnewしなくてもアクセスできるので、何でもstatic変数にデータを格納しがちなのですが、他のインスタンスからも参照されることを忘れてはいけません。例えばWebアプリケーションのように複数スレッドが動作する場合(Javaではプロセスでなくスレッドという単位で並列処理を実現します)、検索結果をstatic変数に格納してしまうと、タイミングによっては他のユーザの検索結果を表示してしまうことがあります(図3)。

図3:static変数とスレッド (画像をクリックすると別ウィンドウに拡大図を表示します)
またstaticメソッドについてもインターフェースで定義できないことから、オブジェクト指向における基本概念の1つである「ポリモーフィズム(注)」が実現できなくなるので、どのように使われるデータ/機能なのかを判断して設計すべきです。
※注:
ポリモーフィズム(Polymorphism)とはオブジェクト指向における重要な考え方の1つで、「同一メソッド名で複数のオブジェクトに仕事をさせる性質のこと」を指す。もしくはメッセージが受手のオブジェクトによって様々に処理されることをいうこともある。
|
Hello World!
|
ここまででひと通りクラスの定義を説明しましたので、いよいよJavaプログラムを組んでみましょう。このクラスは、実行されると標準出力(コンソール)に「Hello World!」と表示するものです。
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
それでは各コードごとに説明していきましょう。
|
1.mainメソッド
|
最初にメソッド宣言部を見てみると、「返り値の型 メソッド名 引数」の形式になっています。ここではpublicキーワードが付与されているので、他のクラスから参照可能です。またstaticメソッドなので、インスタンス化することなく呼び出すことができます。voidはメソッドが返す値がない場合に指定します。複数の値を返すことはできません。
引数はメソッドが処理を行うために必要なデータを小括弧の中に指定します。「型 任意の引数名[, 型 任意の引数名…]」の形式で指定し、複数指定することも可能です。この場合、String型の配列が引数として渡されることを意味しています。また引数が不要ならば小括弧の中に記述する必要はありません。
※注:
今回説明しているmainメソッドは、javaコマンドにて指定されたクラスが最初に呼び出される特殊なメソッドです。メソッドの宣言は「public static void main」で、引数はString型の配列(String[])でなければいけません。mainメソッドが定義されていないクラスは、javaコマンドからクラスを実行することができません。
|
2.System.out.println("Hello World!");
|
この1行で「Systemクラスのstatic変数outが持つインスタンスメソッドprintlnを呼び出す」という意味になります。static変数にアクセスする場合、クラス名.static変数というアクセスの仕方となります。
|
前のページ 1 2 3 次のページ
|

|
|

|
著者プロフィール
サイオステクノロジー株式会社 片桐 一宗
ソフトハウスでC、C++、Javaでの開発経験を積み、テンアートニ(現サイオステクノロジー)入社。Webシステムの設計・開発・保守からプロジェクトリーダーまでこなした後、現在、品質管理チームの一員を担当。サイオステクノロジーのシステム構築サービス品質向上に向け、日々奮闘中。
|
|
|
|