Tôi có câu hỏi về kế thừa và truyền trong Java. Tôi có hai lớp ví dụ sau và một lớp thử nghiệm, và tôi nêu câu hỏi của tôi sau khi các lớp:Thừa kế và đúc trong Java
public class Automobile {
public int var;
public Automobile() {
var = 1;
}
public String toString() {
return "AUTOMOBILE: " + var;
}
}
public class Porsche extends Automobile {
public int var;
public Porsche() {
var = 2;
}
public String toString() {
return "PORSCHE: " + var;
}
}
public class Test {
public static void main (String [] args) {
Porsche p = new Porsche();
Automobile a = new Automobile();
System.out.println ("(Automobile) p = " + (Automobile)p);
System.out.println ("(Automobile) p.var = " + ((Automobile)p).var);
}
}
Đầu ra là:
(Automobile) p = PORSCHE: 2
(Automobile) p.var = 1
Tôi không hiểu tại sao trong báo cáo thứ hai chúng tôi có 1. Không nên là 2? Bởi vì sau khi tôi đúc p để ô tô trong báo cáo đầu tiên tôi vẫn nhận được PORSCHE: 2
như các đại diện của p
- Tôi hiểu điều này theo cách sau:
tuy nhiên tôi đã đúc p
để ô tô p
giữ "bản chất gốc" của nó - p
là một đối tượng của lớp Porsche, nhưng bởi vì Porsche mở rộng ô tô, chúng ta có thể nói rằng p cũng là một ô tô. Và do đó khi chúng tôi đúc nó một cách rõ ràng cho ô tô, nó tiếp tục sử dụng phương pháp của nó - trong trường hợp của chúng tôi phương pháp toString()
được xác định trong Porsche.
Mặt khác, nếu những gì tôi viết là đúng, sau đó báo cáo kết quả in thứ hai nên cung cấp cho 2 và không 1.
Bây giờ điều này dường như mâu thuẫn với tôi, nhưng kể từ khi công trình này trong Java, có vẻ như tôi không hiểu chuyện gì đang diễn ra trong quá trình đúc và quá trình thừa kế.