Trong đoạn mã dưới đâyphương pháp chữ ký trong thừa kế
class A {
public void v(int... vals) {
System.out.println("Super");
}
}
class B extends A {
@Override
public void v(int[] vals) {
System.out.println("Sub");
}
}
Sau đó, tôi có thể gọi new B().v(1, 2, 3);//print Sub rather than Super
đó là vô lý nhưng không làm việc tốt. Nếu tôi thay đổi B
để
class B {
public void v(int[] vals) {
System.out.println("Not extending A");
}
}
cuộc gọi đến new B().v(1, 2, 3);
sẽ là không hợp lệ. Bạn phải gọi nó là new B().v(new int[]{1, 2, 3});
, tại sao?
Một sự hiểu biết đơn giản về kế thừa và quá tải Java có thể giải thích điều này ... Nếu lớp B không mở rộng lớp A, thì lớp B không thể thực hiện phương pháp được viết cụ thể trong lớp A. –
@ MohammadS.what là ma thuật ở đây là phương thức v (int []) trong B thực sự ghi đè phương thức v (int ...) Vì vậy, mặc dù chữ ký của v trong B là v (int []), nó vẫn có thể được gọi bằng cách sử dụng v (1, 2, 3) –
Lưu ý rằng phiên bản đầu tiên của bạn không hoạt động với JDK 7. Bạn đang sử dụng trình biên dịch Java nào? –