Guys, I've come across such legal behaviour:
File B.java:
final class C {} final class D {}
File A.java:
class B {} public class A {}
Questions:
- When class X is required to be placed into its own X.java file? Does class visibility/final matter here?
- Is there any official spec on this class/java relation?
Thanks a lot.
A public class ClassName must be in a file called ClassName.java.
Non-public classes have no such restriction.
A consequence of this is that a Java source file can have only one public class but as many non-public classes as you wish.
In Java, you can have only one top-level
public
class or interface in a source file, and the source file must have the same name as that class or interface.This is not something that's in the Java language specification; this is an implementation-specific thing of Sun's (now Oracle's) implementation of the Java compiler. (Other implementations of the Java compiler might not require this).
The Sun/Oracle compiler allows at most one public top-level class per file, in which case the file name must be the class name.
The Java Language Specification does not mandate this behaviour, but explicitly allows it:
The de-facto standard in most implementations is that a source file can only contain one top-level
public
type definition. The name of the source file must be the name of that type.A source file can contain nested types, but by definition they're not a top-level
public
type.This is recommended in, but not required by, the Java Language Specification.
Note that
final
has nothing to do with accessibility, so it's not a relevant issue in this matter.Related questions
See also