Một tệp java có thể có nhiều hơn một lớp không?


105

Mục đích của việc có nhiều hơn một lớp trong một tệp Java là gì? Tôi mới làm quen với Java.

Đã chỉnh sửa: Điều đó có thể đạt được bằng cách tạo một lớp bên trong bên trong một lớp công khai, phải không?


Câu trả lời:


128

Có, nó có thể. Tuy nhiên, chỉ có thể có một lớp cấp cao nhất công khai cho mỗi .javatệp và các lớp cấp cao nhất công khai phải có cùng tên với tệp nguồn.

Mục đích của việc bao gồm nhiều lớp trong một tệp nguồn là để gói chức năng hỗ trợ liên quan (cấu trúc dữ liệu nội bộ, lớp hỗ trợ, v.v.) cùng với lớp công khai chính. Lưu ý rằng bạn luôn được phép không làm điều này - ảnh hưởng duy nhất đến khả năng đọc (hoặc không) của mã của bạn.


1
Tôi nghĩ bạn nên làm như vậy nếu bạn muốn giữ các lớp học thêm đó ở chế độ riêng tư, để chúng có thể được thay đổi hoàn toàn sau này mà không vi phạm bất cứ điều gì bên ngoài vô tình sử dụng các lớp học đó.
Erich Kitzmueller

3
Nó ở trong đó để tương thích 1.0 (trước các lớp lồng nhau). Đó là một sai lầm lớn trong ngôn ngữ. Ưu điểm lớn nhất của việc sử dụng nó là IDE có khả năng xử lý tệp vô vọng.
Tom Hawtin - tắc bóng vào

25
Một lớp công khai, cấp cao nhất cho mỗi tệp. Có thể có bao nhiêu lớp bên trong công khai trên mỗi tệp tùy thích.
erickson

@Tom, bạn nghĩ lỗi ở phần nào, các lớp bên trong hay nhiều lớp cấp cao nhất trên mỗi tệp?
finnw

@finnw Nhiều lớp cấp cao nhất cho mỗi tệp. Nó chỉ là rất sai lầm. Ở đâu java.awt.LightweightDispatcher?
Tom Hawtin - tackline

17

Nếu bạn muốn triển khai một lớp công khai, bạn phải triển khai nó trong một tệp có cùng tên với lớp đó. Một tệp đơn có thể chứa một công khai và một số lớp riêng. Điều này rất hữu ích nếu các lớp chỉ được sử dụng nội bộ bởi lớp công khai. Ngoài ra, lớp công khai cũng có thể chứa các lớp bên trong.

Mặc dù có một hoặc nhiều lớp riêng tư trong một tệp nguồn duy nhất là tốt, nhưng tôi muốn nói rằng sẽ dễ đọc hơn nếu sử dụng các lớp bên trong và ẩn danh. Ví dụ, người ta có thể sử dụng một lớp ẩn danh để xác định một lớp So sánh bên trong một lớp công khai:

  public static Comparator MyComparator = new Comparator() {
    public int compare(Object obj, Object anotherObj) {

    }
  };

Lớp Comparator thường sẽ yêu cầu một tệp riêng biệt để được công khai. Bằng cách này, nó được đóng gói với lớp sử dụng nó.


1
Nó không thực sự là một lớp riêng nếu nó nằm trong tệp không có sửa đổi. Bạn không thể có một lớp học riêng nếu không có nó là một lớp bên trong bởi vì nếu bạn làm vậy, ai có thể sử dụng nó?
Bjorn

10

Có, bao nhiêu tùy thích!

NHƯNG, chỉ có một lớp "công khai" trong mỗi tệp.


6

Tệp .java được gọi là đơn vị biên dịch. Mỗi đơn vị biên dịch có thể chứa bất kỳ số lượng các lớp và giao diện cấp cao nhất nào. Nếu không có các kiểu cấp cao nhất công khai thì đơn vị biên dịch có thể được đặt tên là bất kỳ thứ gì.

//Multiple.java
//preceding package and import statements

class MyClass{...}
interface Service{...}
...
//No public classes or interfaces
...

Chỉ có thể có một lớp / giao diện công khai trong một đơn vị biên dịch. Cu phải được đặt tên chính xác như loại cấp cao nhất công khai này.

//Test.java
//named exactly as the public class Test
public class Test{...}
//!public class Operations{...}
interface Selector{...}
...
//Other non-public classes/interfaces

Những điểm quan trọng về phương pháp chính - phần 1

Phần 2

(Các điểm liên quan đến số lượng lớp học và mức độ truy cập của chúng được đề cập trong phần 2)


5

Có, bạn có thể tạo nhiều hơn một lớp công khai, nhưng nó phải là một lớp lồng nhau.

public class first {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }

    public class demo1
    {

        public class demo2
        {

        }
    }
}

4

Bên cạnh các lớp bên trong ẩn danh, một cách sử dụng khác là các lớp bên trong riêng tư triển khai giao diện công khai ( xem bài viết này ). Lớp bên ngoài có thể truy cập tất cả các trường và phương thức private của lớp bên trong.

Điều này cho phép bạn tạo hai lớp kết hợp chặt chẽ, chẳng hạn như một mô hình và chế độ xem của nó, mà không để lộ các triển khai của cả hai. Một ví dụ khác là một tập hợp và các trình vòng lặp của nó.


4

Nói chung, nên có một lớp cho mỗi tệp. Nếu bạn sắp xếp mọi thứ theo cách đó, thì khi bạn tìm kiếm một lớp, bạn biết bạn chỉ cần tìm kiếm tệp có tên đó.

Ngoại lệ là khi một lớp được triển khai tốt nhất bằng cách sử dụng một hoặc nhiều lớp trợ giúp nhỏ. Thông thường, mã dễ theo dõi nhất khi các lớp đó có trong cùng một tệp. Ví dụ: bạn có thể cần một lớp trình bao bọc 'tuple' nhỏ để chuyển một số dữ liệu giữa các cuộc gọi phương thức. Một ví dụ khác là các lớp 'nhiệm vụ' triển khai Runnable hoặc Callable. Chúng có thể quá nhỏ nên được kết hợp tốt nhất với lớp cha tạo và gọi chúng.


4

Có 200% ,

Thí dụ:

class A {
 void methodDeclaration() { System.out.println("!!!"); }
 }
 class B {
 public static void main(String[] args) {
new A().methodDeclaration();
    }
 }

2

Có, nó có thể, nhưng chỉ có thể có 1 lớp công khai bên trong bất kỳ gói nào vì trình biên dịch java tạo tệp .Class có cùng tên với tên lớp Công khai, do đó nếu chúng có nhiều hơn 1 lớp công khai thì sẽ khó chọn trình biên dịch đó phải là tên của tệp Lớp.


1

Thay đổi ... Một ví dụ như vậy sẽ là một lớp ẩn danh (bạn sẽ gặp phải rất nhiều điều đó khi sử dụng trình nghe sự kiện và những thứ đó).


1

Tôi nghĩ rằng nó phải là "chỉ có thể có một lớp công khai cấp cao nhất NON-STATIC cho mỗi tệp .java". Phải không?


Bạn nên hỏi điều này như một câu hỏi hơn là trả lời ở đây.
Ashish Kumar

1

Nếu bạn muốn triển khai một singleton, đó là một lớp chạy trong chương trình của bạn với chỉ một thể hiện trong bộ nhớ trong suốt quá trình thực thi ứng dụng, thì một trong những cách để triển khai một singleton là lồng một lớp tĩnh riêng bên trong một lớp công khai . Sau đó, lớp private bên trong chỉ khởi tạo chính nó khi phương thức public của nó để truy cập cá thể private được gọi.

Kiểm tra bài viết wiki này,

https://en.wikipedia.org/wiki/Singleton_pattern

Khái niệm này cần một thời gian để nhai lại.


1

Trong tệp .java, chỉ có thể có một lớp cấp cao nhất công khai có tên giống với tệp, nhưng có thể có một số lớp bên trong công khai có thể được xuất cho mọi người và truy cập vào các trường / phương thức của lớp bên ngoài, chẳng hạn : AlertDialog.Builder (được sửa đổi bởi 'public static') trong AlertDialog (được sửa đổi bởi 'public')


1

Có Bạn có thể có nhiều hơn một Lớp trong một tệp .Java. Nhưng Bạn đã đặt một trong số chúng ở chế độ Công khai. và lưu tệp .java có cùng tên với tên của lớp công khai. khi bạn sẽ biên dịch tệp .java đó, bạn sẽ nhận được các tệp .class riêng biệt cho mỗi lớp được xác định trong tệp .java.

Ngoài ra, có quá nhiều phương pháp để xác định nhiều hơn một lớp trong một tệp .java.

  1. sử dụng khái niệm của Lớp bên trong.
  2. Khái niệm sử dụng các lớp ẩn danh.

1

Đúng ! Tệp .java chỉ có thể chứa một lớp công khai.

Nếu bạn muốn công khai hai lớp này, chúng phải được đặt vào hai tệp .java: A.java và B.java.


2
Tôi không chắc chắn hơn so với phản ứng add của bạn bất cứ điều gì nhiều hơn từ 12 người khác câu trả lời
goto

1

Có, bạn có thể có nhiều lớp bên trong tệp .java. Nhiều nhất một trong số chúng có thể được công khai. Những người khác là gói-riêng tư. Chúng KHÔNG THỂ được riêng tư hoặc được bảo vệ. Nếu một tệp là công khai, tệp phải có tên của lớp đó. Nếu không, BẤT KỲ ĐIỀU GÌ có thể được đặt cho tệp đó như tên của nó.

Có nhiều lớp bên trong một tệp có nghĩa là các lớp đó nằm trong cùng một gói. Vì vậy, bất kỳ lớp nào khác bên trong gói đó nhưng không có trong tệp đó cũng có thể sử dụng các lớp đó. Hơn nữa, khi gói đó được nhập, lớp nhập cũng có thể sử dụng chúng.

Để có một cuộc điều tra chi tiết hơn, bạn có thể truy cập bài đăng trên blog của tôi tại đây .


1
Chào mừng bạn đến với Stack Overflow! Tôi đánh giá cao rằng bạn đã giải thích thông tin chưa được đề cập ở đây. Bạn cũng đã làm rất tốt việc trích dẫn bài đăng trên blog của mình trong khi tuyên bố quyền sở hữu và bao gồm thông tin có liên quan ở đây. Nếu bạn chọn đóng góp nhiều hơn cho trang web này trong tương lai (và tôi hy vọng bạn cũng vậy), hãy đảm bảo xem xét bài viết này để đảm bảo bài viết của bạn tiếp tục được đón nhận nếu bạn trích dẫn blog của mình.
4castle

0

Chỉ có thể có một lớp công khai cấp cao nhất trong một tệp. Tên lớp của lớp công khai đó phải là tên của tệp. Nó có thể có nhiều lớp bên trong công khai.

Bạn có thể có nhiều lớp trong một tệp duy nhất. Các giới hạn cho các mức độ hiển thị lớp khác nhau trong một tệp như sau:

Các lớp cấp cao nhất:
1 lớp công khai
0 lớp riêng tư
bất kỳ số lớp mặc định / được bảo vệ

Các lớp bên trong:
bất kỳ số lượng lớp bên trong nào có bất kỳ khả năng hiển thị nào (mặc định, riêng tư, được bảo vệ, công khai)

Xin vui lòng sửa cho tôi nếu tôi sai.


0

Có, nó có thể. Tuy nhiên, chỉ có thể có một lớp công khai trên mỗi tệp .java, vì các lớp công khai phải có cùng tên với tệp nguồn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.