0

这是代码:

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”的确切含义是什么?

4

4 回答 4

2

因为一个Java源文件最多只能有一个顶级public类或接口,而且源文件的名称必须与该类或接口的名称相同。

这是 Oracle JDK 的 Java 编译器强加的规则。

于 2012-08-15T09:26:03.227 回答
2

这是语言特性。每个 .java 文件必须只有一个top-level公共类,并且公共类名必须源 java 文件名匹配。

基本上,非公共类型在之外是不可访问的,因此如果您希望允许在任何地方使用类型,那么将其设为public

永远不要在默认包中创建类型。(始终使用包

雇员.java


package com.abc.model;

public class Employee{..}

EmployeeTest.java


package com.abc.test;

public class EmployeeTest{ ... }
于 2012-08-15T09:26:10.250 回答
2

在 Java 中,每个源文件只能有一个公共顶级类,并且它需要与文件命名相同。

当编译器需要从包外部定位类定义时,这对编译器很有用,因为它知道类型名称,它知道在哪个类文件中找到该类。例如。由于 jar 文件本质上是一个带有类文件的 zip 文件,因此编译器不必解压缩整个 jar 文件来查找类定义。

Java 语言规范 §7.6 将此指定为可选限制;

当且仅当包存储在文件系统中(第 7.2 节)时,如果在由类型名称组成的名称下的文件中未找到类型,主机系统可能会选择强制限制它是编译时错误如果满足以下任一条件,则加上扩展名(例如 .java 或 .jav):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共的(因此可以从其他包中的代码中访问)。

于 2012-08-15T09:27:27.443 回答
0

您可以在合法的公共类中定义一个公共类。

public class EmployeeTest
{
     public class Employee {

     }
}
于 2012-08-15T09:28:17.267 回答