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;
}

私の質問は:2番目のクラス定義の最初の行に、なぜそれを定義するために「パブリック」を置くことができないのですか?それを使用してクラスを定義するときの「パブリック」の正確な意味は何ですか?

4

4 に答える 4

2

Java ソース ファイルは最上位のpublicクラスまたはインターフェイスを 1 つしか持つことができず、ソース ファイルの名前はそのクラスまたはインターフェイスの名前と同じでなければならないためです。

これは、Oracle の JDK の Java コンパイラが課す規則です。

于 2012-08-15T09:26:03.227 に答える
2

これが言語機能です。top-level.java ファイルごとにパブリック クラスは 1つだけ存在する必要があり、パブリック クラス名はソース Java ファイル名と一致する必要があります。

基本的に、非 public型はパッケージ外ではアクセスできないため、型をどこでも使用できるようにしたい場合は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 では、ソース ファイルごとに 1 つのパブリックトップ レベル クラスしか存在できず、ファイルと同じ名前を付ける必要があります。

これは、コンパイラがパッケージの外部からクラス定義を見つける必要がある場合に便利です。コンパイラは型名を認識しており、どのクラス ファイルでクラスを検索するかを認識しているためです。たとえば、jar ファイルは本質的にクラス ファイルを含む zip ファイルであるため、コンパイラがクラス定義を見つけるために jar 全体を解凍する必要がなくなります。

Java 言語仕様 §7.6では、これをオプションの制限として指定しています。

パッケージがファイル システム (§7.2) に格納されている場合に限り、ホスト システムは、型名で構成される名前のファイルに型が見つからない場合、コンパイル時エラーであるという制限を適用することを選択できます。次のいずれかに該当する場合は、拡張子 (.java または .jav など) を追加します。

  • 型は、型が宣言されているパッケージの他のコンパイル単位のコードによって参照されます。

  • この型は public と宣言されています (したがって、他のパッケージのコードからアクセスできる可能性があります)。

于 2012-08-15T09:27:27.443 に答える
0

正当なパブリック クラス内にパブリック クラスを定義できます。

public class EmployeeTest
{
     public class Employee {

     }
}
于 2012-08-15T09:28:17.267 に答える