2017-08-16 22 views
8

Hãy nhìn vào mã này:Java - kéo dài tại sao biến siêu a là 0

class Sup { 
    int a = 8; 

    public void printA() { 
     System.out.println(a); 
    } 

    Sup() { 
     printA(); 
    } 
} 

public class Sub extends Sup { 
    int a = 9; 

    @Override 
    public void printA() { 
     System.out.println(a); 
    } 

    Sub() { 
     printA(); 
    } 

    public static void main(String[] args) { 
     Sub sub = new Sub(); 
    } 
} 

kết quả: console in: 0 9
Tôi biết rằng lớp con đầu tiên sẽ gọi cha constructor
nhưng, tại sao là 0 9, không phải là 8 9?

+0

Bạn có chắc chắn hàm tạo được gọi theo thứ tự bạn nghĩ không? –

+4

@ cricket_007: Tất nhiên nó được gọi. Bạn ** không thể ** tránh gọi nó trong Java. –

+0

@ T.J.Crowder Bạn có thể tránh nó bằng cách sử dụng serialization hoặc nhân bản. – Flown

Trả lời

14

Khi các nhà xây dựng Sup gọi printA() nó thực hiện các phương pháp printA của lớp Sub (mà override phương thức cùng tên của lớp Sup), do đó nó sẽ trả về giá trị của a biến của lớp Sub, mà vẫn còn 0, vì các biến mẫu của Sub chưa được khởi tạo (chúng chỉ được khởi tạo sau khi hàm tạo Sup được thực hiện).

+2

Đây cũng là lý do tại sao một số tiêu chuẩn mã yêu cầu tất cả các phương thức được gọi trong hàm tạo là 'final' hoặc' private'. Để ngăn chặn ghi đè gây ra những tình huống này. – Kiskae

Các vấn đề liên quan