2012-06-24 37 views
7

Ok, đây có thể là câu hỏi về kiddies trong java. Chúng tôi không thể xác định hai lớp công khai trong một tệp. Nhưng, trong một trong những ví dụ từ hướng dẫn nghiên cứu cuốn sách SCJP, ví dụ này đã được đề cập:Hai lớp học công khai trong một tệp java

public abstract class A{ 
    public abstract void show(String data); 
} 

public class B extends A{ 
    public void show(String data){ 
     System.out.println("The string data is "+data); 
    } 
    public static void main(String [] args){ 
     B b = new B(); 
     b.show("Some sample string data"); 
    } 
} 

Khi tôi copy dán này vào netbeans ngay biên dịch lỗi được ném, mà public class A tôi nên đề cập trong tập tin riêng biệt. Có phải ví dụ từ hướng dẫn styudy của SCJP thực sự sai? Cũng trong một số thử nghiệm giả tôi đã tìm thấy nhiều câu hỏi có mẫu như vậy nhưng không có lựa chọn nào là lỗi trình biên dịch được đề cập đến. Bắt lo lắng đây

+3

Có phải lớp học phải ở trong cùng một tệp không? – Puce

+0

Đồng ý, hai lớp đó phải nằm trong các tệp riêng biệt. –

+0

Bạn không nên lo lắng về cuốn sách; nếu bạn biết những gì trong cuốn sách đó, bạn sẽ vượt qua với màu sắc bay. – Tom

Trả lời

8

vâng, 2 lớp công cộng cấp cao nhất không được phép vào một tập tin

+0

sau đó làm thế nào đến một hướng dẫn nghiên cứu có uy tín của SCJP là làm như vậy sai lầm? – Shades88

+3

Có lẽ nó không ** nói rằng hai lớp đó phải ở trong cùng một tệp. Sai lầm bởi người mới Java ... không phải bởi hướng dẫn nghiên cứu :-) –

+0

Thực ra tôi khá chắc chắn rằng JLS không yêu cầu "một lớp cấp cao nhất cho mỗi tệp" nhưng chỉ đề xuất nó. – Voo

0

bạn có thể làm 2 lớp công chúng trong một tập tin, bên trong một lớp có chứa chúng.

Bạn cũng nên thêm "tĩnh" cho chúng, nếu bạn không cần tham chiếu đến lớp chứa.

-1

Giả sử bạn có thể đặt hai lớp công khai vào một tệp, sau đó suy nghĩ về công việc của trình biên dịch: nó phải tạo tệp .class từ tệp .java của bạn đại diện cho một lớp. sẽ không có ý nghĩa gì cả).

Cách trình biên dịch JAVA hoạt động, nó sẽ tạo một tệp .class với tên tệp của bạn và sẽ tìm kiếm lớp có tên tệp trong tệp đã cho của bạn - do đó nó phụ thuộc vào tên tệp của bạn sẽ được biên dịch chính xác và sẽ không được.

Dài câu chuyện ngắn: không, bạn không thể đặt hai lớp công khai trong một tệp vì trình biên dịch sẽ không thể xử lý chính xác.

(Edit: nó dĩ nhiên có thể định nghĩa các lớp mới bên trong một lớp nào đó có cùng tên với tập tin của bạn.)

+2

JAVAC KHÔNG tạo các tệp .class trên cơ sở tên tệp nguồn (.java). Ví dụ: Nếu 'abc.java' có một' lớp DEF' và được biên dịch, nó sẽ tạo ra một tệp 'DEF.class'. –

+0

C# cho phép nhiều lớp công khai trong cùng một tệp. Tôi nhận ra thủ tục biên dịch của Java không được thiết kế cho điều này, vì vậy có những lý do ngôn ngữ cụ thể để không thực hiện nó. Ước gì họ sẽ thay đổi nó để hoạt động như hệ thống của C#, mặc dù vậy; nó rất khó chịu. – Venryx

+0

Ngay cả ngôn ngữ jvm scala -another - xử lý nhiều cấp cao nhất/lớp công khai trong một tệp. – javadba

2

Vâng, nếu một người là rất kén chọn: bạn có thể có nhiều lớp được định nghĩa với công cụ sửa đổi công khai trong cùng một tệp, tức là sử dụng lớp lồng nhau (bên trong) tĩnh. như thế này:

File -> Test.java

public class Test { 

    public static class SomeNestedClass { 

    } 

} 
1

Có bạn có thể có hai lớp trong cùng một tập tin. Bạn có thể có chúng bằng cách xóa công cụ sửa đổi truy cập công khai khỏi cả tên lớp, như được hiển thị bên dưới,

abstract class A{ 
    public abstract void show(String data); 
} 

class B extends A{ 
    public void show(String data){ 
     System.out.println("The string data is "+data); 
    } 
    public static void main(String [] args){ 
     B b = new B(); 
     b.show("Some sample string data"); 
    } 
} 
Các vấn đề liên quan