0

私は違いがないと思ったが、それから私はこれに遭遇した:

public class Whatever
{

 String toString()  
{
//stuff
}

}

このコードにより、コンパイラエラーが発生します。

toString()inはinWhateverをオーバーライドできません。より弱いアクセス権限を割り当てようとしています。だったtoString()java.lang.Objectpublic

明示的に入力public String toString()すると、コードは問題なくコンパイルされます。

4

3 に答える 3

5

publicメソッドとフィールドにアクセス指定子を使用しない場合、それらはpackageレベル以下の可視性であると見なされます。

これは、クラス外での可視性の観点からの意味packageと意味の優れた図です。public

Modifier       Class    Package   Subclass  World
----------------------------------------------------------
public           Y         Y         Y        Y       
protected        Y         Y         Y        N
no modifier      Y         Y         N        N       <--- This is package level
private          Y         N         N        N

Yメソッド、クラス、またはフィールドが表示されていることを意味します。

Nメソッド、クラス、またはフィールドが表示されないことを意味します

于 2013-03-23T23:07:18.673 に答える
0

@Hunter McMillenは、パッケージレベルの可視性(+1)について言及しました。

それが何を意味するのか簡単な説明を追加したいと思います。これは、同じパッケージのクラスと現在のクラスのサブクラスが、それ自体が他のパッケージに属している場合でも、このメソッド/フィールドにアクセスできることを意味します。

于 2013-03-23T23:09:57.573 に答える
0

継承では、メソッドをオーバーライドするときに、メソッドのアクセススコープを絞り込むことはできません。ここで、クラスのメソッドはtoString()アクセス権を持っており、クラスはアクセスレベルを(アクセス修飾子が指定されていないのと同等)に変更することでスコープを絞り込もうとしていますが、これは許可されていません。ObjectpublicWhateverpackage

packageレベルメソッドは次のように定義できます。

void someMethod () {
}

ここに表示されている場合、の前にアクセス修飾子はありませんvoid。つまりpublic、にアクセスできるのと同じパッケージにあるすべてのクラスを意味しprotectedます。パッケージの外部にあるパッケージは、このメソッドにアクセスできません。サブクラスもアクセスできません。privateWhateverWhatever

明示的に書くpublicと、全体が自由に使えるようになります。

于 2013-03-23T23:12:21.547 に答える