重複の可能性:
シャドーイングの概念
クラスのフィールドがアップキャスト中に 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 のフィールドが使用されるのかわかりません。のインスタンスが使用されると予想されるので、なぜこれが起こらないのですか? 私は何が欠けていますか?myStringtesttestSubClassmyStringSubClass
SubClass演算子を使用してmyString にアクセスできることはわかっていますthis。たとえばprintMyString、SuperClass でメソッドを定義し、それを次のように上書きできます。
public void printMyString()
{
System.out.println(this.myString);
}
では、SubClass私の質問は主に のフィールドが でどのようにSuperClass使用されるかについてtestです。多分私は明らかな何かを見逃していますか?
答えを検索しようとしましたが、見つけた最も近いトピックはUpcasting in Java と 2 つの個別のオブジェクト プロパティでしたが、役に立ちましたが、私の質問には答えませんでした。
前もって感謝します