【问题标题】:Problems about java syntax [duplicate]关于java语法的问题[重复]
【发布时间】:2012-08-11 14:29:59
【问题描述】:

代码如下:

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”来定义它? 当使用它定义一个类时,“public”的确切含义是什么?

【问题讨论】:

  • 如果它在一个名为 Employee.java 的文件中,您可以在那里公开它

标签: jvm java


【解决方案1】:

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

基本上,non-public 类型在 package 之外是不可访问的,所以如果您希望允许在任何地方使用类型,那么将其设为 public

永远不要在默认包中创建类型。 (Always use package)

Employee.java


package com.abc.model;

public class Employee{..}

EmployeeTest.java


package com.abc.test;

public class EmployeeTest{ ... }

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你能证明“最多一个”部分的证据吗?我一遍又一遍地搜索规范,并没有发现这样的限制。除此之外,Employee 是一个不受其公开与否影响的顶级类。
    • 一个源文件可以有零个或一个顶级public 类或接口。它不是语言规范的一部分(它不是 AVD 所说的语言功能);这是 Oracle 的 Java 编译器的一个限制。
    【解决方案3】:

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

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

    Java language specification §7.6 将此指定为可选限制;

    当且仅当包存储在文件系统中(第 7.2 节),主机 系统可以选择强制它是一个编译时的限制 如果在由 类型名称加上扩展名(例如 .java 或 .jav),如果其中任何一个 以下是正确的:

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

    • 类型被声明为公共的(因此可能是可访问的 来自其他包中的代码)。

    【讨论】:

      【解决方案4】:

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

      public class EmployeeTest
      {
           public class Employee {
      
           }
      }
      

      【讨论】:

      • @joshz,是的,你可以这样做
      • 好吧,这在他的具体情况下是行不通的。内部类必须是static
      猜你喜欢
      • 2013-03-05
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多