【Java】継承したクラスをインスタンス化した時のイメージ
はじめに
Javasilver勉強中に????になったことを自分に刻むためのメモ
今回の????となった問題
※著作権とかあるかわからないですが、怖いのでそのままではないです。
パッケージ構成
test1
┗Human.java
test2
┗Engineer.java
┗Main.java
package test1;
public class Human {
private String name;
protected String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package test2;
import test1.Human;
public class Engineer extends Human {
}
package test2;
public class Main {
public static void main(String[] args) {
Engineer e = new Engineer();
e.setName("おなまえ");
System.out.println(e.getName());
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
メソッド getName() は型 Human で不可視です
at test2.Main.main(Main.java:7)
ソースを追ってみる
・Humanクラスを定義
private のフィールドnameをGetter、Setterで使うDTOみたいなクラス
・Engineerクラスを定義
Humanクラスを継承(しただけ)
・Mainクラス
mainメソッドでEngineerクラスをインスタンス化
Setterで値をセット
Getterで値をとってきて出力(しようとしてコンパイルエラー(なんで!!))
当時の思考回路
・あ!!! Getterがprotectedになっている
・つまり、Getterにアクセスできるかどうかの問題、、、
・protectedはサブクラスか同じパッケージから利用可能...
・MainとEngineerクラスは同じパッケージ...
・答えはセットした値がそのまま出力されるだぁぁぁぁ
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
メソッド getName() は型 Human で不可視です
at test2.Main.main(Main.java:7)
(撃沈)
どこが間違っていたか
・protectedはサブクラスか同じパッケージから利用可能...
これと、
Engineer e = new Engineer();の時にどのようなインスタンスが生成されているか。
実際の動き
Engineer e = new Engineer();
EngineerクラスにHumanクラスの内容がコピペされてインスタンス化(上)されるのではなく、
HumanクラスとEngineerクラスの性質を併せ持ったインスタンスが生成されている(下)。
エラーメッセージにも『メソッド printInfo() は型 Human で不可視です』となっているので、
getName()はやはり、Humanクラスのものになっているようです。
Getterをpublicにしてみる
package test1;
public class Human {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
おなまえ
できた。
余談
Humanクラスを無名パッケージに入れるとそもそもアクセスできない。
無名パッケージに何かしらのパッケージからアクセスできないので、
Human.java
test2
┗Engineer.java
┗Main.java
Author And Source
この問題について(【Java】継承したクラスをインスタンス化した時のイメージ), 我々は、より多くの情報をここで見つけました https://qiita.com/akeyozoz/items/163b09cee706f9dedda7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .