以下是代码:
public class EmployeeTest
{
public static void main(String args[]){
//System.out.println("hello world");
Employee aEmployee = new Employee("David",1000);
System.out.println(aEmployee.getName() + aEmployee.getSalary());
}
}
class Employee // **why can't I put a "public" here**
{
// Constructor
public Employee(String name, double salary)
{
this.name = name;
this.salary = salary;
}
// Methods
public String getName()
{
return this.name;
}
public double getSalary()
{
return this.salary;
}
// instance field
private String name;
private double salary;
}
我的问题是:在第二类定义的第一行中,为什么我不能用“ public ”来定义它? 使用它时“公共”的确切含义是什么定义了一个类?
答案 0 :(得分:2)
因为Java源文件最多只能有一个顶级public
类或接口,并且源文件的名称必须与该类或接口的名称相同。
这是Oracle JDK的Java编译器强加的规则。
答案 1 :(得分:2)
这是语言功能。每个.java文件必须只有一个top-level
公共类,公共类名必须匹配源java文件名。
基本上,非公开类型无法在包之外访问,因此如果您希望允许在任何地方使用类型,请将其设为 public 。
永远不要在默认包中创建类型。 (Always use package)
Employee.java
package com.abc.model;
public class Employee{..}
EmployeeTest.java
package com.abc.test;
public class EmployeeTest{ ... }
答案 2 :(得分:2)
在Java中,每个源文件只能有一个 public 顶级类,并且需要将其命名为与文件相同的名称。
当编译器需要从包外部定位类定义时,这对编译器很有用,因为它知道类型名称,它知道要在哪个类文件中找到类。例如。因为jar文件本质上是一个带有类文件的zip文件,所以这可以防止编译器解压缩整个jar来查找类定义。
Java language specification §7.6将此指定为可选限制;
当且仅当包存储在文件系统(第7.2节)中时,主机 系统可以选择强制执行它是编译时的限制 如果在由...组成的名称下的文件中找不到类型,则会出错 类型名称加上一个扩展名(如.java或.jav) 以下是真实的:
该类型由其他编译单元中的代码引用 声明类型的包。
该类型被声明为public(因此可以访问) 来自其他软件包中的代码。)
答案 3 :(得分:0)
您可以在合法的公共类中定义公共类。
public class EmployeeTest
{
public class Employee {
}
}