Javaオブジェクト指向(2)〜修正ver〜
継承
- クラス名の後にextends ClassName
- 継承されたクラス:スーパークラス、継承したクラス:サブクラス
- すべてのクラスはObjectクラスを継承している→extends書いていない時はコンパイラが自動的に追加
- 直接のスーパークラスはたった一つ(単一継承)←→多重継承
- extendsすると継承されるもの(○はされる、×はされない)
- (○)フィールド
- (○)メソッド
- (×)コンストラクタ!
- super()はスーパークラスの引数なしコンストラクタ
- extendsしたクラスのコンストラクタの一番最初の処理は必ずsuper()
- コンストラクタ何もなし→引数なしコンストラクタ生成→サブクラスに何も書いていなければ引数なしコンストラクタ生成される→スーパークラスで引数なしコンストラクタを書いた→サブクラスは引数なしコンストラクタしかないのでコンパイルエラー
// User.java public class User { public String name; public void speak() { System.out.println("I'm" + name + "."); } } /** UserSuper.java * ・コンストラクタ明記せず(今回のコード) * →サブクラスでクラスでデフォルトコンストラクタ * →スーパークラスでデフォルトコンストラクタ。コンパイル可能。 * ・もしスーパークラスで引数ありコンストラクタを明記 * →サブクラスでデフォルトコンストラクタ * →サブクラスのなかのsuper();が実行できずコンパイルエラー! */ public class UserSuper extends User { public static void main(String[] args) { public String age; public void speak() { System.out.println("I'm" + name + ", and" + age + "years old."); } User2 user2 = new User2(); user2.speak(); } } // UserSuper.java // コンストラクタ明記 public class UserSuper extends User { public static void main(String[] args) { public String age; public void speak() { System.out.println("I'm" + name + ", and" + age + "years old."); } User2 user2 = new User2(); user2.speak(); } }
多態性
オーバーライド
- 約束事3点
- メソッドの戻り値が同じ
- メソッド名が同じ
- 引数が一致
- オーバーライドさせたくない場合はfinalをつける
- finalの使い方3つ
- クラス(継承を禁止)
- メソッド(オーバーライドを禁止)
- フィールド(代入を禁止)
オーバーロード
- 同じ名前のメソッドを複数作成可能
- 戻り値は自由
- メソッド名が同じ
- 引数はを一致させてはいけない(引数が同じ場合実行時に見分けつかない。引数の型と順番に注意する。)
多態性の制限
- サブクラスで作ったオブジェクトはスーパークラスの変数に代入することができる。
- 以上の場合、以下のコメントの現象に注意。
// User.java public class User { public String name; public void speak() { System.out.println("I'm" + name + "."); } } // UserSuper.java public class UserSuper extends User { public static void main(String[] args) { public String age; public int setAge(int age) { this.age = age; } public void speak() { System.out.println("I'm" + name + ", and" + age + "years old."); } User user = new User2();// 可能。 user.setAge(20); // コンパイルエラー。Userクラスにはわからない! user.speak(); // User2のspeak()が呼び出される!オーバーライドされる。 // 要はメソッド名と引数! } }
(追記)
さっきまでは多態性のところでかなり混乱していたが、要はメソッドはメソッド名だけが名前じゃなくて、メソッド名と引数をあわせて名前。名字と名前みたいな感じ。
〜やるべきこと〜
githubでのソースコード管理
今日Amazonの本が届く。