class Movie {
public void play() {
System.out.println("playing movie");
}
}
class DVD extends Movie {
@Override
public void play() {
System.out.println("playing dvd");
}
public void menu() {
System.out.println("showing menu");
}
}
public class Main {
public static void main(String[] args) {
Movie m = new DVD();
m.play();
m.menu(); //error
}
}
私の理解では、mはDVDオブジェクトです。そのため「DVD再生」を印刷します。しかし、なぜ
m.menu()
親クラスのMovieからオーバーライドされていない場合、エラーが発生しますか?Movieクラスにmenu()メソッドがないという不満があります。
また、どのような状況で、あるオブジェクトを次のように宣言しますか
Parent obj = new children();
このような?子クラスのメソッドが親からオーバーライドされていることを確認したいときにこれを行いますか?その場合は、親クラスのメソッドを「抽象」にしたり、親をインターフェイスとして作成したりしませんか?私のタイトルは誤解を招く可能性がありますが、この動作はアップキャスティングと呼ばれていますか?または多形?j
あなたが見るときMovie m = new DVD()
、あなた、人間は、それm
がDVDであることを知っています。しかし、コンパイラはそれを知りません-それが知っているべきだとあなたが言ったのはそれだけなので、それはそれが映画であることを知っているだけです。したがって、を見るとm.menu()
、Movieでそのメソッドを探しますが、見つかりません。コードを分析して、それm
が実際にはMenuのサブクラスであり、具体的にはDVDであり、そのクラスにが含まれていることを確認することはありませんmenu()
。を考えるだけなMovie m
ので、Movieにはメソッドがないと文句を言いmenu()
ます。
これはJavaで常に発生し、次のような行が表示される場合があります。
List<Foo> myList = new ArrayList<>();
「「インターフェースにプログラムする」とはどういう意味ですか?」を参照してください。なぜあなたがそれをしたいかについて。ただし、質問については、特にArrayListtrimToSize()
がListで定義されていないメソッドを定義していることに注意してください。myList
上記のように宣言した場合、を呼び出すことはできませんmyList.trimToSize()
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加