关于java语法的问题

时间:2012-08-15 09:24:05

标签: jvm java

以下是代码:

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 个答案:

答案 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 {

     }
}