我有文件 TestClass.java
package com.fido.android.sample.dsm.SoftPin.Core;
public class TestClass
{
public int mValue1;
public String mValue2;
}
现在在这个文件中( TestClass.java )我想再声明一个类,但是当我写例如:
public class SecondClass
{
// Class members goes here.
}
编译器不允许我这样做,如果我删除public
一切正常,但我只能在 TestClass.java 中使用SecondClass
< / strong>,我不能写
SecondClass sc = new SecondClass();
TestClass.java 类。现在我想知道是否有办法做这样的事情,在同一个文件中有两个类,并从各处使用它们(不是内部类)。
答案 0 :(得分:3)
问题是:为什么要在同一个Java类文件中声明第二个公共类? Java中的规则是每个公共类必须在单个类文件中声明 - 除了Graham Borland指出的嵌套类。
答案 1 :(得分:2)
简答:你不能。
这就是Java的工作原理。
您只能为每个文件声明一个公共类,其类名与文件名相同。
您可以使用Graham建议的内部分类,或者更好的是,将第二个类移动到新文件中。
答案 2 :(得分:1)
如果SecondClass
内TestClass
(即嵌套在类定义中),并且具有公开可见性,那么您可以在任何地方引用TestClass.SecondClass
。
答案 3 :(得分:1)
不,如果编译器选择从Java语言规范中强制执行此规则,则不能section 7.6:
当软件包存储在文件系统(第7.2.1节)中时,如果在由以下文件组成的名称下的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则输入类型名称加上扩展名(例如.java或.jav):
- 该类型由声明类型的包的其他编译单元中的代码引用。
- 该类型声明为public(因此可以从其他包中的代码访问)。
这个限制意味着每个编译单元最多只能有一个这样的类型。
所以这是可选,因为在单个源文件中包含多个公共顶级类仍然是“合法Java” - 但它对编译器拒绝它也是有效的。在实践中,我认为我曾经使用的每个基于文件的Java编译器都强制执行此规则。
现在你可以尝试找到一个不同的编译器,如果你真的想要,但是有一个原因:Java程序员习惯于找到公共顶级类型的源代码(通常是任何顶级类型)在具有相同名称的源文件中。
挑衅性地回答问题:为什么要让源代码难以导航?
答案 4 :(得分:0)
你不能。
您可以做的是inner classes。
答案 5 :(得分:0)
根据java约定,应该在与类名相同的单独文件中创建公共类。
所以你不能在同一个文件中创建两个公共类。
你可以尝试从一个班级中删除公共或者创建内部班级。
答案 6 :(得分:0)
由于公共类必须与源文件同名,因此java文件中只能有一个pulbic类。