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.
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.
JLS 7.6 Top Level Type Declarations
When packages are stored in a file system, the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java
or .jav
) if either of the following is true:
- The type is referred to by code in other compilation units of the package in which the type is declared.
- 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 compiler for the Java programming language or an implementation of the Java virtual machine to find a named class
within a package; for example, the source code for a public
type wet.sprocket.Toad
would be found in a file Toad.java
in the directory wet/sprocket
, and the corresponding object code would be found in the file Toad.class
in the same directory.
Note that final
has nothing to do with accessibility, so it's not a relevant issue in this matter.
Related questions
- What should be the name of a Java source that contains more than one class?
See also
- Java Tutorials/Packages/Managing Source and Class Files
- Joseph D. Darcy's blog - Nested, Inner, Member, and Top-Level Classes
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:
When packages are stored in a file
system (§7.2.1), the host system may
choose to enforce the restriction that
it is a compile-time error if a type
is not found in a file under a name
composed of the type name plus an
extension (such as .java or .jav) if
either of the following is true:
- The type is referred to by code in
other compilation units of the package
in which the type is declared.
- 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 compiler for the
Java programming language or an
implementation of the Java virtual
machine to find a named class within a
package;