質問事項
abstractなクラスNormalHumanで定義されている変数nameを、サブクラスのコンストラクタで初期化をしています。
スーパークラスを継承しているので、this.name = name
で書き換えれば良いのかと考えました。
ですが、super.name = name
でも問題なく動いてしまいます。
自身の知識では、"thisはインスタンス自身を指す。"という認識です。
スーパークラスを継承しているので、NormalHumanクラスもnameは所持していることになるので、this.name = nameは動くのは理解できます。
そこで、疑問なのが、super.name = name
で動いた場合はどういった考えをモテが良いということです。
質問事項2
interfaceでメソッドを定義する場合のアクセルレベルは、なぜpublicなのでしょうか。
abstractクラスでは、protected abstract
が可能です。
アクセルレベルがpublicでのみ実装できるということは、protected等で実装したい場合はinterfaceは使えないということだと思ってしまいました。
それは果たして不便では無いのだろうか?という疑問が残ります。
よろしくおねがいします
理解不足の質問かもしれませんが、ご回答をいただけますと幸いです。
よろしくおねがいします。
Java
1 2abstract class NormalHuman{ 3 String name; 4 5 void walk() { 6 System.out.println(name + " can walk."); 7 } 8 9 abstract void speak(); //abstractメソッドはabstractクラス内にしか書けない。 10} 11 12interface SuperHuman{ 13 void fly(); //interfaceでは抽象メソッドは自動でpublic abstract 14} 15 16class Human extends NormalHuman{ 17 18 Human(String name) { 19 this.name = name; //this.name = name でも実行可能。なぜ? 20 } 21 22 @Override 23 public void speak() { 24 System.out.println(name + " can Speak Japanese."); 25 } 26} 27 28class SuperMan extends NormalHuman implements SuperHuman{ 29 30 public SuperMan(String name) { 31 this.name = name; 32 } 33 34 @Override 35 public void speak() { 36 System.out.println(name + " can Speak All langage."); 37 } 38 39 @Override 40 public void fly() { 41 System.out.println(name + " can fly"); 42 } 43} 44 45public class Issue_6 { 46 public static void main(String[] arg) { 47 Human takeda = new Human("Takeda"); 48 takeda.walk(); 49 50 Human yoshida = new Human("Yoshida"); 51 yoshida.speak(); 52 53 SuperMan ikeda = new SuperMan("Ikeda"); 54 ikeda.walk(); 55 ikeda.speak(); 56 ikeda.fly(); 57 } 58}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。