重複の可能性:
シャドーイングの概念
クラスのフィールドがアップキャスト中に Java でどのように処理されるかについて混乱しています。例えば:
class SuperClass
{
String myString = "String in SuperClass";
public void myMethod()
{
System.out.println("Method in SuperClass");
}
}
class SubClass extends SuperClass
{
String myString = "String in SubClass";
public void myMethod()
{
System.out.println("Method in SubClass");
}
}
class Question
{
public static void main(String[] args)
{
SuperClass test = new SubClass();
// object test is an instance of SubClass
// but I am telling the compiler to treat it as SuperClass
test.myMethod();
System.out.println(test.myString);
}
}
出力:
Method in SubClass
String in SuperClass //Why is "String in SubClass" not used?
オブジェクトを作成すると、test
それはSubClass
クラスのインスタンスです。ただし、コンパイラに として扱うように指示していSuperClass
ます。SubClass
メソッドの動作についてはすべて明らかです。特定のメソッドが に対して定義されている場合にのみ、 のメソッドを使用できますSuperClass
。
ただし、のにSuperClass
アクセスしようとすると、なぜ a のフィールドが使用されるのかわかりません。のインスタンスが使用されると予想されるので、なぜこれが起こらないのですか? 私は何が欠けていますか?myString
test
test
SubClass
myString
SubClass
SubClass
演算子を使用してmyString にアクセスできることはわかっていますthis
。たとえばprintMyString
、SuperClass でメソッドを定義し、それを次のように上書きできます。
public void printMyString()
{
System.out.println(this.myString);
}
では、SubClass
私の質問は主に のフィールドが でどのようにSuperClass
使用されるかについてtest
です。多分私は明らかな何かを見逃していますか?
答えを検索しようとしましたが、見つけた最も近いトピックはUpcasting in Java と 2 つの個別のオブジェクト プロパティでしたが、役に立ちましたが、私の質問には答えませんでした。
前もって感謝します