JavaSilverでメモしたところ備忘録として残しておこうと思います。
スーパークラスとサブクラス
- サブクラスは一つのスーパークラスしか持たない
- すべてのクラスはObjectクラスのサブクラスである
- finalクラスはサブクラスを持てない
- サブクラスはスーパークラスのフィールドとメソッドを受け継ぐ
コンストラクタは継承されない
privateのメソッドをサブクラスがオーバーライドしていた場合はスーパークラスのメソッドとサブクラスでオーバライドしたメソッドは別のメソッドとして処理される
- finalなメソッドはオーバーライドできない
- サブクラスのインスタンスはスーパークラスのインスタンスとみなすことができる
class Super{
int val = 4 ;
}
class Subclass extends Super{
int val = 8;
public static void main(String[] args){
Super num = new Subclass("hoge")
System.out.println(num.val)
}
- 上記の"num"からはサブクラスで宣言されたフィールドを参照することができない
- "num"に対して実行できるのはスーパークラスで定義されているものだけ、サブクラスでオーバーライドされていたらサブクラスが呼び出される
- 子クラス(サブクラス)は親クラスのフィールド(変数・メソッド)を使える
多態性(ポリモーフィズム)
- 抽象クラス」や「インターフェース」などを利用してメソッドの呼び出し方法を共通化しオーバーライドさせることで同じメソッド呼び出しでも実際のインスタンスマイにその挙動を変えるもの
- スーパークラスとサブクラスに同じ名前のフィールドがあった場合は宣言した変数の型によって決まる。A型ならAクラスのフィールドを参照する
- スーパークラス型(A型)のサブクラスのインスタンス(new B())を定義した場合にはBのインスタンスをA型として扱っているので
B独自のメソッドを呼び出すことはできない
コンパイルエラーが発生する
- 注意すべきはインスタンスを扱っている型(Aクラス)に呼び出しているメソッドがあるかを注意してみる
オーバーライドしている場合はインスタンス化されているB型を参照することに注意する。
抽象クラス
- 抽象クラスとはメソッドの名前と引数の型が決まっていて実装がない抽象メソッドを含んだクラスのこと、自らは実装しないがサブクラスに対しどのように実装するか強制する。ByteやIntegerなどのクラスのスーパークラスであるNumberクラスが代表例