一个Java文件可以有多个类吗?


Answers:


128

是的,它可以。但是,每个文件只能有一个公共顶级.java,并且公共顶级类必须与源文件具有相同的名称。

在一个源文件中包含多个类的目的是将相关的支持功能(内部数据结构,支持类等)与主要的公共类捆绑在一起。请注意,不要这样做总是可以的-唯一的影响就是代码的可读性。


1
我想这样做是个好主意,如果您想让这些额外的类保持私有,那么以后可以完全更改它们而不会破坏任何意外使用这些类的内容。
Erich Kitzmueller 09年

3
它在那里是为了1.0兼容性(在嵌套类之前)。这是语言上的一个大错误。使用它的最大优点是IDE具有无望的文件处理功能。
Tom Hawtin-大头钉

25
每个文件一个公共的顶级类。每个文件可以有尽可能多的公共内部类。
erickson

@Tom,您认为哪一部分是错误的,每个文件有内部类或多个顶级类?
finnw 2011年

@finnw每个文件有多个顶级类。真是错。哪里java.awt.LightweightDispatcher
Tom Hawtin-大头钉

17

如果要实现公共类,则必须在与该类同名的文件中实现它。一个文件可以包含一个公共类,也可以包含一些私有类。如果这些类仅由公共类在内部使用,则这很有用。另外,公共类也可以包含内部类。

尽管在一个源文件中有一个或多个私有类是可以的,但是我想说使用内部类和匿名类是更容易理解的。例如,可以使用匿名类在公共类中定义Comparator类:

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

    }
  };

Comparator类通常需要单独的文件才能公开。这样,它便与使用它的类捆绑在一起。


1
如果它在没有修饰符的文件中,那么它实际上不是私有类。如果没有私有类,则不能拥有私有类,因为如果有,那么谁可以使用它?
比约恩

10

是的,您想要多少!

但是,每个文件中只有一个“公共”类。


6

.java文件称为编译单元。每个编译单元可以包含任意数量的顶级类和接口。如果没有公共的顶级类型,则可以为编译单元命名。

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

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

编译单元中只能有一个公共类/接口。cu必须完全与此公共顶级类型命名。

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

有关主要方法的重点-第1部分

第2部分

(有关第2部分中的类数及其访问级别的要点)


5

是的,您可以创建多个公共类,但是它必须是嵌套类。

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}

4

除了匿名内部类之外,另一种用法是实现公共接口的私有内部类(请参阅本文)。外部类可以访问内部类的所有私有字段和方法。

这样,您就可以创建两个紧密耦合的类,例如模型及其视图,而无需公开这两个类的实现。另一个示例是集合及其迭代器。


4

通常,每个文件应有一个类。如果以这种方式组织事情,那么当您搜索一个类时,您将知道只需要搜索具有该名称的文件。

例外是,最好使用一个或多个小型帮助程序类来实现一类。通常,当这些类存在于同一文件中时,最容易遵循这些代码。例如,您可能需要一个小的“元组”包装器类才能在方法调用之间传递一些数据。另一个示例是实现Runnable或Callable的“任务”类。它们可能很小,以至于最好与创建并调用它们的父类结合使用。


4

是200%

例:

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

2

是的,可以,但是在任何包中只能有1个公共类,因为java编译器创建的.Class文件的名称与公共类名称相同,因此,如果它们超过1个公共类,则很难选择编译器应该是Class文件的名称。



1

我认为应该是“每个.java文件只能有一个STATIC顶级静态类”。是不是


您应该问这个问题而不是在这里回答。
Ashish Kumar

1

如果要实现单例,即该类在程序中运行,并且在应用程序的整个执行过程中只有一个实例在内存中运行,那么实现单例的一种方法是将一个私有静态类嵌套在一个公共类中。然后,内部私有类仅在调用其访问私有实例的公共方法时实例化自己。

查看此Wiki文章,

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

这个概念需要一段时间才能坚持下去。


1

在.java文件中,只能有一个公共顶级类,其名称与文件相同,但是可能有几个公共内部类,可以将其导出给所有人并访问外部类的字段/方法,例如:AlertDialog(由“ public” 修改)中的AlertDialog.Builder(由“ public static” 修改)


1

是的。一个.Java文件中可以有多个类。但是您已经公开其中之一。并以与公共类名称相同的名称保存.java文件。当您编译该.java文件时,对于在.java文件中定义的每个类,您将获得单独的.class文件。

除此之外,还有太多方法可以在一个.java文件中定义一个以上的类。

  1. 使用内部类的概念。
  2. 匿名类的使用概念。

1

是的!.java文件只能包含一个公共类。

如果要公开这两个类,则必须将它们放入两个.java文件中:A.java和B.java。


2
我不确定您的回复是否会从其他12个答案中添加更多内容
转到

1

是的。.java文件中可以包含多个类。其中最多可以是公开的。其他的都是包私有的。它们不能是私有的或受保护的。如果是公开的,则文件必须具有该类的名称。否则,可以为该文件提供任何名称。

在一个文件中包含许多类意味着这些类在同一包中。因此,位于该软件包中但不在该文件中的任何其他类也可以使用这些类。而且,当导入该包时,导入类也可以使用它们。

有关更详细的调查,您可以在此处访问我的博客文章。


1
欢迎使用Stack Overflow!非常感谢您阐述了此处未涵盖的信息。您还很好地引用了博客文章,同时声明了所有权并在此处包括相关信息。如果您将来选择为该网站做出更多贡献(希望您这样做),请确保考虑本文,以确保在引用博客时您的帖子继续受到好评。
4castle

0

一个文件中只能有一个公共类顶级类。该公共类的类名应为文件名。它可以有许多公共内部类。

一个文件中可以包含多个类。文件中各个级别的类可见性的限制如下:

顶级类别:
1个公共类别
0个私人类别
任意数量的默认/受保护类别

内部类:
具有任何可见性的任意数量的内部类(默认,私有,受保护,公共)

如果我错了,请纠正我。


0

是的,它可以。但是,每个.java文件只能有一个公共类,因为公共类必须与源文件具有相同的名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.