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

Posted

技术标签:

【中文标题】一个java文件可以有多个类吗?【英文标题】:Can a java file have more than one class? 【发布时间】:2010-11-01 09:16:18 【问题描述】:

在一个 Java 文件中包含多个类的目的是什么?我是 Java 新手。

已编辑: 这可以通过在公共类中创建内部类来实现,对吧?

【问题讨论】:

In java can i have more than one class/object in a file?的可能重复 【参考方案1】:

变化...一个这样的例子是anonymous classes(在使用事件监听器等时你会遇到很多)。

【讨论】:

【参考方案2】:

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

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

【讨论】:

我认为如果您想将这些额外的类保密,这样做是个好主意,这样以后可以完全更改它们,而不会破坏任何意外使用这些类的外部内容。 它在那里是为了兼容 1.0(在嵌套类之前)。这是语言上的一个大错误。使用它的最大优势是 IDE 对文件的处理毫无希望。 每个文件一个公共的***类。每个文件可以有任意多个公共内部类。 @Tom,你认为哪一部分是错误的,内部类还是每个文件多个***类? @finnw 每个文件有多个***类。真是大错特错。 java.awt.LightweightDispatcher在哪里?【参考方案3】:

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

【讨论】:

【参考方案4】:

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

虽然在单个源文件中包含一个或多个私有类很好,但我想说使用内部类和匿名类更易读。例如,可以使用匿名类在公共类中定义 Comparator 类:

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

    
  ;

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

【讨论】:

如果它在带有 no-modifier 的文件中,它就不是真正的 private 类。你不能有一个 private 类而不是一个内部类,因为如果你这样做了,谁可以使用它?【参考方案5】:

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

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

【讨论】:

【参考方案6】:

除了匿名内部类之外,另一个用途是实现公共接口 (see this article) 的私有内部类。外部类可以访问内部类的所有私有字段和方法。

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

【讨论】:

【参考方案7】:

是的,想多少就多少!

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

【讨论】:

【参考方案8】:

我认为应该是“每个 .java 文件只能有一个非静态***公共类”。 不是吗?

【讨论】:

您应该将其作为一个问题提出,而不是在这里回答。【参考方案9】:

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

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

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

编译单元中只能有一个公共类/接口。 c.u.必须完全按照此公共***类型命名。

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

Important points about the main method - part 1

Part 2

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

【讨论】:

【参考方案10】:

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

查看这篇 wiki 文章,

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

这个概念需要一段时间才能理解。

【讨论】:

【参考方案11】:

在一个.java文件中,只能有一个与文件同名的公共***类,但可能有多个公共内部类,可以导出给每个人并访问外部类的字段/方法,例如:AlertDialog.Builder(由'public static'修改)中的AlertDialog(由'public'修改)

【讨论】:

【参考方案12】:

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

除此之外,在一个 .java 文件中定义多个类的方法太多了。

    使用内部类的概念。 使用匿名类的概念。

【讨论】:

【参考方案13】:

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

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

【讨论】:

我不确定您的回复是否会从其他 12 个答案中添加更多内容【参考方案14】:

是的,您可以在一个 .java 文件中拥有多个类。最多其中一个可以是公开的。其他的是包私有的。它们不能是私有的或受保护的。如果一个是公共的,则该文件必须具有该类的名称。否则,任何东西都可以作为其名称赋予该文件。

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

如需更详细的调查,您可以访问我的博文here。

【讨论】:

欢迎来到 Stack Overflow!感谢您阐述了此处尚未涵盖的信息。您还很好地引用了您的博客文章,同时声明所有权并在此处包含相关信息。如果您选择在未来为本网站做出更多贡献(我希望您这样做),请务必考虑 this article 以确保您的帖子在引用您的博客时继续受到好评。【参考方案15】:

是的 200%

例子:

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

【讨论】:

【参考方案16】:

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

public class first 

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

    public class demo1
    

        public class demo2
        

        
    

【讨论】:

【参考方案17】:

一个文件中只能有一个公共类***类。该公共类的类名应该是文件的名称。它可以有许多公共内部类。

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

***课程: 1 个公开课 0 私人课程 任意数量的默认/受保护的类

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

如果我错了,请纠正我。

【讨论】:

不能有一个受保护的***类 - 请参阅 here 了解原因。【参考方案18】:

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

【讨论】:

以上是关于一个java文件可以有多个类吗?的主要内容,如果未能解决你的问题,请参考以下文章

java里面可以没有主类吗?

JAVA中子类能修改父类吗?

我可以有多个基类吗?

一个 Ruby 对象可以有多个特征类吗?

您可以从单个 Nodejs 模块中导出多个类吗?

一个JAVA类文件中只能有一个public类吗?