When java class X required to be placed into a fil

2019-07-21 17:39发布

问题:

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:

  1. When class X is required to be placed into its own X.java file? Does class visibility/final matter here?
  2. Is there any official spec on this class/java relation?

Thanks a lot.

回答1:

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


回答2:

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.



回答3:

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).



回答4:

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;



标签: java class