※初めてこのサイトに来た方は
↓Java入門メモについて(必読)を読んでください。
http://ameblo.jp/javareference/entry-10815079120.html
主に参考書で見慣れないプログラム文を見た時に役に立つ文献です。
豆知識と言うか、難しい解説になっている項目を
くだけた表現でわかりやすいようにしています。
| 1.クラス内、メソッドの外で使える要素について |
「3:演算子、class、mainについて」で
main{}の外に命令文を書くと大抵の物はエラーになるので{}の中に書いてください。
と書きました。
mainやメソッドを問わず、メソッドの外では
if( ){ } 制御構文
a(); メソッドの「呼び出し」
変数の「代入」(初期化はOK)
が書けません。
メソッドの戻り値を変数の初期化に使う目的でメソッドを呼び出すのはOKです。
例:int a = getNo();
| 2.メソッドの引数について |
a( );やa( ){ }とメソッドを定義する時、( )の中の値の事を引数と呼ぶと
どちらの引数なのか説明するときややこしくなります。
a( );の( )に入る引数は実引数といいます。
a( ){ }の( )に入る引数は仮引数といいます。
| 3.staticについて |
staticは「クラスの定義」、「mainメソッド以外のメソッドや色々な場面で使える」
という風に書きました。
でもstaticを付けなくてもメソッドの外で変数を宣言をすることはできます。
クラス内、メソッドの外でstaticを付けずに宣言した変数や
staticを付けないで作ったメソッドは
「そのクラスを変数に代入した時(インスタンス化した時)に使える」のです。
(HelloWorld a = new HelloWorld();
a.b;
a.c();
などの事です)
なのでstaticではない変数、staticではないメソッドは
「インスタンス変数」「インスタンスメソッド」と呼ばれています。
static変数、staticメソッドは、クラス内で自由に使えるので
「クラス変数」「クラスメソッド」と呼ばれています。
クラス内で自由に使えない「インスタンス変数」「インスタンスメソッド」が
クラス内で自由に使える「クラスメソッド」内で使えると、矛盾が生まれるので
staticメソッド内ではstaticではない変数やメソッドは使えません。
(クラスを変数に代入(インスタンス化)して
インスタンス内のstaticではない変数やメソッドを使うのはOKです)
staticではないメソッド内なら
staticではないメソッドやフィールド(豆知識4参照)を呼び出せます。
staticな要素はクラス全体に影響するので
クラスの中、メソッドの外でしか「宣言」できません。
| 4.フィールド、ローカル変数、仮引数について |
メソッド内やコンストラクタ内、制御構文内(if文など)で宣言した変数の事を
「ローカル変数」と言います。
そのメソッド内やコンストラクタ内、制御構文内でしか使えないからです。
なので、staticにできません。
{ }の更に内側の{ }内でなら使う事ができます。
{ }の更に内側の{ }内で使う場合は
更に内側の{ }内に入る前に
変数の宣言(できれば初期化も)をしていないといけません。
仮引数(豆知識1参照)もこれと同じだと思っておいて構いません。
メソッドの外で宣言、初期化した変数は「フィールド」といいます。
ローカル変数と違ってクラス全体がこの変数の存在を知る事になるからです。
インスタンス化した時、フィールドしか参照できないので
そのクラスの「パラメータ」だと思っておけばいいと思います。
| 5.メソッドの多重起動について |
Method.getInstance().setMsg();と続いている文について
Method.getInstance();が単純にMethod型のオブジェクトを
戻り値として返すだけのメソッドだとします。
(処理内容は
Method method = new Meshod();
return method; だけ)
Method.getInstance();の処理が終わった時の「戻り値のインスタンス」の
setMsg()メソッドを実行しているのです。
この場合は
その戻り値の値 method のsetMsg()メソッドを使っているという意味になります。
| 6.無名、匿名クラス(new HelloWorld( ){ };という長い文)について |
無名クラス(匿名クラス)とは
インターフェイスを受け継いだクラスをわざわざ作らなくても
その場でインターフェイス内のメソッドの定義ができるというものです。
「インターフェイスのみの宣言でインスタンスを作ってる」
という風に見えるかもしれません。
インターフェイスを覚えた時、きっと役に立ちます。
継承でも同じことができます。
ただし、一つのインターフェイスかクラスしか受け継ぐ事ができません。
//インターフェース
interface Hello {
public void sayHello();
}
//無名クラスを使ってインスタンス化した例
class HelloWorld5 {
public static void main(String[] args){
Hello abc = new Hello() {
public void sayHello() {
}
}; //←セミコロンが必要
}
}
|
↑は、↓と同じです。
//インターフェイスを実装したクラスをインスタンス化した例
interface Hello {
public void sayHello();
}
class HelloWorld4 implements Hello {
public void sayHello() {
}
}
class HelloWorld5 {
public static void main(String[] args) {
HelloWorld4 a = new HelloWorld4();
}
}
|