2014年11月17日月曜日

Java対策 Java用語と継承編

同級生の皆様向けにJavaの解説を、と思って書きました。
単位獲得の手助けになれば幸いです。
間違っている事も結構書くと思うのでその際はご指摘をお願いします。

---

Java対策 Java用語と継承編


ここでは「犬」を例えに使用する。

クラス


いくつかの変数、メソッドをひとまとめにして書いたもの
ここでは犬のDNAに例える

記述:
class クラス名
例:
public class Dog

インスタンス化


クラスはDNAみたいなものでそのままではほぼ何も出来ないので、DNAから生命を生み出す作業が必要になる。

(DNAに対して「お手!」は出来ないが、DNAから誕生した犬に「お手!」は可能と言った感じ)

生み出された生命体はJavaではインスタンスと呼ばれる

記述:
クラス名 変数名 = new クラス名();

例:
Dog pochi = new Dog();


メソッド


命令。C言語だと関数と呼ばれていたもの

記述:
void メソッド名(引数)
例:
public void cry() {
    System.out.println("ワンワン!");
}


コンストラクタ


インスタンス化(DNAから生命を生み出す瞬間)の時のみ呼び出される特別な命令

以下の2つの条件

  • クラス名と全く同じメソッド名を付ける
  • 返り値(voidやint)を書かない
を満たすとコンストラクタになる

変数の初期化に使うと吉

記述:
public クラス名()

例:
public Dog() {
    age=4;
}


クラス変数


普通変数をいじるにはインスタンス化が必要だが、staticで宣言したクラス変数という物は、インスタンス化が不要でいつでもどこからでも値を変えることが出来る

DNAの例えで言うと、生命体を生み出す前にDNAのパラメータを直接操作できてしまうようなもの
そしてDNAを操作すると生み出される/生み出された生命体全てに影響が及ぶ

DNAの例えを聞くと危険なように聞こえるが実際かなり危険である

記述:
public static void String type = "柴犬"

補足:
普通の変数は
Dog pochi = new Dog();
pochi.type="ブルドッグ"
という感じで変数をいじるが、クラス変数は
Dog.type="ブルドッグ"
というように変更できてしまう
これを行うと生み出された後の犬を含め全ての犬がブルドッグに強制変更となる


継承


例えば、犬だけでなく猫と鳥のクラスを作りたくなったとしよう。
それぞれのクラスには年齢や名前などの情報、鳴いたりご飯を食べたりといった動作を付けたい。
しかし
class Dog {
 〜いろいろ〜
}
class Cat {
 〜いろいろ〜
}
class Bird {
 〜いろいろ〜
}
と別々に書くのは効率が悪い。

そこで、共通点を見つけまとめられないかを検討する。

犬、猫、鳥は動物である。

つまりAnimalというクラスを作れば共通化出来そうである。
動物は共通してギャッと鳴けると思うので、仮に「全ての動物はギャッと鳴く」とする。

class Animal {
 public void cry() {
        System.out.println("ギャッ")
    }
}

では、犬は動物であるという関係を実装する。
class Dog extends Animal {
}
この場合のAnimalを親クラス、Dogを子クラスと呼ぶ。

つまり
class 子クラス extends 親クラス
と書けばクラスの継承ができる。

また、「犬は動物である」といった関係を「is-a関係」と呼ぶ。
(Dog is a Animal.)

ちなみに、この状態でDogに対してcryを呼ぶと
ギャッ
と表示されるというなんとも痛々しい実行結果になる。
そこで、鳴くという処理だけ上書きをしてしまいたい。
その場合に使用するのが「オーバーライド」である。

class Dog extends Animal {
    @Override
    public void cry() {
        System.out.println("ワンワン!");
    }
}

このように、親クラスと全く同じ名前のメソッドを作ると、処理を上書きすることが出来る。
(ちなみに@Overrideは無くても動くが、あったほうがエラーがあった時に教えてもらえやすくなる)

この状態でDogに対してcryを呼ぶと
ワンワン!
と元気よく鳴いてくれるのである。



また、上書きではなく親クラスのメソッドに書き足しを行いたい場合は、
super()
を使用する。
これを書くことで、親クラスのメソッドの内容を呼び出すことが出来る。

class Dog extends Animal {
    @Override
    public void cry() {
        super();
        System.out.println("ワンワン!");
    }
}

このcryメソッドを実行すると以下のように表示される。
ギャッ
ワンワン!


〜 まだ書き途中です 〜



0 件のコメント:

コメントを投稿