Em là newbie đang học hỏi về JAVA…
cho em hỏi là tại sao nếu mình cho 2 class đều là public thì sẽ bị lỗi khi chạy vậy ạ?
Nếu chỉ có 1 class là public thôi thì sẽ chạy được, em cảm ơn!!!
Về vấn đề Public Class trong Java
Bạn học cách đọc thông báo lỗi đi, dòng cuối nó báo rõ ràng đó. IDE nó quy định là 1 file java thì chỉ có 1 class public trùng tên với file đó. Do đó nếu bạn viết 2 cái class public nó sẽ không biết chọn cái nào để biên dịch và gây lỗi.
Cách giải quyết là chuyển class Bike kia sang 1 file mới là Bike.java
Mình nghĩ nếu bạn biên dịch bằng javac terminal chắc vẫn chạy đấy (chưa thử)
Nguyên tắc là ko được có 2 public class cùng 1 file. Vì compiler cần tạo file .class từ một public class cùng tên với tên file đó.
ok may anh, em hieu roi
Sửa lại
Java có rule là trong 1 file source code .java, nếu có khai báo public class thì bắt buộc nó phải trùng tên file và chỉ được phép khai báo 1 public class trong 1 file (trừ inner class).
Nhưng nếu tất cả class trong file đều là default access thì đặt tên tùy ý, compiler vẫn tạo được tất cả file .class bằng số class khai báo. Vậy lý do thực sự ko phải là “bắt buộc phải trùng tên file thì nó mới compile được”.
Theo ý hiểu:
Public khác default ở chỗ: public được import ở mọi nơi, default chỉ import nội bộ trong cùng package. Có hạn chế như kia giúp compiler tìm public class nhanh hơn,
Giả sử file A.java có 2 public class A & B, ví dụ cần import class B thì compiler cần duyệt tất cả các file trong package đó để tìm ra B. Trong khi nếu file B.java chỉ gồm 1 public class B duy nhất thì nó nhảy thẳng đến B.java.
- The type is declared
public
(and therefore is potentially accessible from code in other packages).
This restriction implies that there must be at most one such type per compilation unit. This restriction makes it easy for a Java compiler to find a named class within a package.
In practice, many programmers choose to put each class or interface type in its own compilation unit, whether or not it ispublic
or is referred to by code in other compilation units.
Source: https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html#jls-7.6
Còn tại sao default access ko cần hạn chế này, thì trong tài liệu chính thống ko thấy nhắc đến.