2015-04-06 16 views
9

Ok chỉ dành riêng cho kiến ​​thức sake, tôi đã cố gắng dưới đây trường hợp (Giả sử rằng lớp A và B là trong cùng một gói)Tại sao Ngoại lệ hoặc Lỗi không được tạo khi không tìm thấy phương pháp chính nào?

ClassA

public class ClassA { 

    public static void main(String[] args) { 
    System.out.println("A"); 
    } 
} 

ClassB

public class ClassB extends ClassA { 

    public static void main(String[] args) { 
    System.out.println("B"); 
    } 
} 

thực hiện trên ClassB nó sẽ sản xuất đầu ra của B ngay bây giờ sau khi thay đổi bên dưới trong classB

ClassB

public class ClassB extends ClassA { 
    //blank body 
} 

Nếu tôi biên dịch và chạy trong terminal nó mang lại cho tôi ra A đó là hoàn toàn bất ngờ vì nó nên đã cho NoSuchMethodError như không có phương pháp chính được họ để vui lòng giải thích những hành vi kỳ lạ?

Lưu ý: Nhiều câu trả lời chứa Override từ vui lòng sử dụng hiding vì chúng tôi không thể ghi đè phương thức tĩnh trong java.

+1

Không có phương pháp ghi đè 'tĩnh', nhưng có ** ẩn **. Trong trường hợp đầu tiên, 'ClassB' ẩn phương thức' main' khỏi 'ClassA'. Trong trường hợp thứ hai, 'ClassB' không ẩn phương thức' main', vì vậy phương thức 'fromA' được gọi. –

Trả lời

7

Trong trường hợp đầu tiên, bạn đang ẩn phương thức main vì bạn đang xác định phương thức mới trong lớp con, trong trường hợp thứ hai bạn không phải là tài khoản chính của A.

Xem The Java™ Tutorials - Overriding and Hiding:

Nếu một lớp con định nghĩa một phương pháp static với chữ ký giống như một phương pháp static trong lớp cha, sau đó phương pháp trong lớp conda một trong siêu lớp.

+0

chúng tôi không thể ghi đè các phương thức tĩnh như java nói :) –

+1

@BhargavModi Thật vậy, ghi đè là một từ xấu. Đã sửa. – Maroun

+0

@Maroun Maroun, đây là những gì tôi đã chứng minh với các lớp học của tôi. @ Boris the Spider; hãy thử thực hiện. –

0

public static void main(String[] args) chỉ là phương pháp mà bạn kế thừa từ A trong trường hợp thứ hai.

2

Trong các lớp con Java kế thừa tất cả các phương thức của các lớp cơ sở của chúng, bao gồm các phương thức tĩnh của chúng.

Xác định phương thức thể hiện trong lớp con có tên trùng khớp và thông số của phương thức trong siêu lớp là ghi đè. Làm điều tương tự cho các phương thức tĩnh ẩn phương thức của lớp bậc trên.

Ẩn không có nghĩa là phương pháp biến mất, mặc dù: cả hai phương pháp vẫn được gọi với cú pháp thích hợp. Trong ví dụ đầu tiên của bạn, mọi thứ đều rõ ràng: cả hai số AB đều có số main của riêng chúng; gọi A.main() in A, trong khi gọi B.main() in B.

Trong ví dụ thứ hai của bạn, hãy gọi số B.main() cũng được cho phép. Kể từ main được kế thừa từ A, kết quả là in A.

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