thể trùng lặp:
The concept of shadowingJava xử lý các trường khi upcasting như thế nào?
Tôi đang bối rối về cách các lĩnh vực của các lớp được xử lý trong Java trong upcasting. Ví dụ:
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);
}
}
Output:
Method in SubClass
String in SuperClass //Why is "String in SubClass" not used?
Khi tôi tạo ra một đối tượng test
nó là một thể hiện của lớp SubClass
; tuy nhiên, tôi đang nói cho trình biên dịch xem nó là SuperClass
. Tất cả mọi thứ rõ ràng với tôi về phương pháp làm việc: Tôi sẽ chỉ có thể sử dụng các phương pháp của SubClass
, nếu một phương pháp nhất định được xác định cho SuperClass
.
Tuy nhiên, tôi bị mất là lý do tại sao một trường của SuperClass
được sử dụng khi tôi cố gắng truy cập myString
của test
. Kể từ test
là một phiên bản của SubClass
Tôi mong đợi myString
được xác định trong SubClass
để được sử dụng, tại sao điều này không xảy ra? Tôi đang thiếu gì?
Tôi biết rằng tôi có thể truy cập, myString của SubClass
bằng cách sử dụng toán tử this
. Ví dụ, tôi có thể xác định printMyString
phương pháp trong SuperClass, và ghi đè lên nó với
public void printMyString()
{
System.out.println(this.myString);
}
Trong SubClass
, vì vậy câu hỏi của tôi chủ yếu là về cách đến các lĩnh vực của SuperClass
được sử dụng trong test
. Có lẽ tôi đang thiếu một cái gì đó hiển nhiên?
Tôi đã cố tìm kiếm câu trả lời và chủ đề gần nhất tôi tìm thấy là Upcasting in Java and two separate object properties, mặc dù hữu ích nhưng nó không trả lời được câu hỏi của tôi.
Cảm ơn bạn trong Advance
câu hỏi hay @Akavall –