2011-07-07 44 views
12

Tôi đã đọc một phần Tĩnh học trong hướng dẫn nghiên cứu SCJP, và nó đề cập đến những điều sau đây:Việc định nghĩa lại các phương thức tĩnh có nghĩa là gì trong Java?

phương pháp tĩnh không thể được ghi đè, nhưng chúng có thể được định nghĩa lại

gì định nghĩa lại thực sự có nghĩa là gì? Có phải là một trường hợp có một phương thức tĩnh tồn tại trong cả cha và con, với cùng một chữ ký, tuy nhiên chúng được tham chiếu riêng biệt bởi tên lớp của chúng? Chẳng hạn như:

class Parent 
{ 
    static void doSomething(String s){}; 
} 

class Child extends Parent 
{ 
    static void doSomething(String s){}; 
} 

Được tham chiếu là: Parent.doSomething();Child.doSomething();?

Ngoài ra, điều tương tự cũng áp dụng cho các biến tĩnh hay chỉ là các phương pháp tĩnh?

Trả lời

17

Điều này đơn giản có nghĩa là các chức năng không phải là ảo. Ví dụ, giả sử bạn có một đối tượng kiểu (runtime) Child được tham chiếu từ một biến kiểu Parent. Sau đó, nếu bạn gọi doSomething, phương pháp doSomething của Phụ Huynh được gọi:

Parent p = new Child(); 
p.doSomething(); //Invokes Parent.doSomething 

Nếu các phương pháp là không tĩnh, doSomething của trẻ em sẽ ghi đè mà Phụ Huynh và child.doSomething sẽ được gọi.

Các lưu giữ tương tự cho các trường tĩnh.

6

Phương tiện tĩnh có một lớp cho mỗi lớp, thay vì một lớp cho mỗi đối tượng. Điều này đúng cho cả hai phương thức và biến.

Trường tĩnh sẽ ngụ ý rằng có một trường như vậy, bất kể có bao nhiêu đối tượng của lớp đó được tạo. Vui lòng xem Is there a way to override class variables in Java? cho câu hỏi ghi đè trường tĩnh. Tóm lại: một trường tĩnh không thể bị ghi đè.

Hãy xem xét điều này:

public class Parent { 
static int key = 3; 

public void getKey() { 
    System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
} 

public class Child extends Parent { 

static int key = 33; 

public static void main(String[] args) { 
    Parent x = new Parent(); 
    x.getKey(); 
    Child y = new Child(); 
    y.getKey(); 
    Parent z = new Child(); 
    z.getKey(); 
} 
} 

I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 3 
I am in class tools.Child and my key is 3 

chính không bao giờ trở lại như 33. Tuy nhiên, nếu bạn ghi đè getKey và thêm video này vào trẻ em, sau đó kết quả sẽ khác nhau.

@Override public void getKey() { 
System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 33 
I am in class tools.Child and my key is 33 

Bằng cách ghi đè phương thức getKey, bạn có thể truy cập khóa tĩnh của trẻ.

0

Trong câu trả lời rajah9 nếu bây giờ chúng ta làm cho hai phương pháp tĩnh ở cả phụ huynh và trẻ em:

public static void getKey() { 
     System.out.println("I am in and my key is " + key); 
    } 

Hai điều cần lưu ý bây giờ: Không thể sử dụng 'this.getClass()' và cảnh báo 'Các getKey phương pháp tĩnh() từ loại Chánh nên được truy cập một cách tĩnh' cũng

Parent z = new Child(); 
    z.getKey(); 

sẽ cung cấp cho sản lượng

I am in class tools.Parent and my key is 3 

thay vì

I am in class tools.Parent and my key is 33 
Các vấn đề liên quan