0

私はJavaに頭を突っ込んでいて、この例に出くわしました

interface Nose{
    public int iMethod();
}

abstract class Picasso implements Nose{
    public int iMethod(){
        return 7;
    }
}

class Clowns extends Picasso{}

class Acts extends Picasso{
    public int iMethod(){
        return 5;
    }
}

何も public と宣言されていないため、これらのクラスを別のファイルから呼び出すことはできませんか? 別のファイルがあります

public class Of76 extends Clowns{
    public static void main(String[] args) {
        Nose [] i = new Nose[3];
        i[0] = new Acts();
        i[1] = new Clowns();
        i[2] = new Of76();
        for(int x = 0; x < 3; x++) {
            System.out.println(i[x].iMethod()+" "+i[x].getClass());
        }

    }
}

したがって、この例では、クラス Of76 は、パブリック クラスを持たない別のファイルからクラスを作成できます。最初のファイルがこれらすべてのクラスを持つことができる理由と、それらが別々のクラスにない理由について混乱しています。パブリックではないクラスはデフォルトでプライベートであり、同じクラス内でのみ呼び出すことができると読みました。Nose ファイル内のすべては、その Nose ファイル内でのみ呼び出すことができますか?

4

2 に答える 2

2

この質問に対する答えは、視点の問題です。

あなたが Java の初心者で、言語機能とオブジェクト指向パラダイムを学んでいる場合、合理的な答えは「常にクラスを作成する必要がありますpublic」です。可視性は、本番コードの場合、または他のクライアントが使用するために API をエクスポートする場合にのみ問題になります。優れたクラスの書き方を理解するまでは、クラスを公開することは不合理ではありませ(ただし、このアドバイスをクラスのフィールドに適用するつもりはありません)。

でも...

本番コードを保守または変更している場合、または他のプログラマーが使用できるようにエクスポートする予定の API を開発している場合、最善の答えは、「publicクライアントがアクセスできるようにするという明確な意図がない限り、決してクラスを作成しないでください」です。クラスを作成し、独自のクライアント コードで使用します。

可視性は、Java における最も重要なセキュリティおよびカプセル化のメカニズムの 1 つであり、本番環境では決して無頓着にすべきではありません。API 内のすべてのものは、可視性を可能な限り低くする必要があります。

使用している可能性のある他の A​​PI によって課せられる重要な例外がいくつかあります。たとえば、JavaFX のコントローラ クラスを開発している場合、JavaFX 2.2 では、必要かどうかにかかわらず、クラスを公開する必要があります。それでも、これらの例外は、「API 内のすべての可視性を可能な限り低くする必要がある」というルールを破るものではありません。

TL;DR: 作業中のコードに自分しかアクセスできない場合は、クラスを public 以外にする必要はありません。プロダクション コード、他のユーザーが利用できるようになるコード、またはクライアントが使用するためにエクスポートする予定の API に取り組んでいる場合は、それが設計の一部として明確に示されていない限り、クラスを公開しないでください。

  • public MyClassこのクラスは、パッケージ内のクラスと他のパッケージ内のクラスに表示されます。
  • protected MyClassこのクラスは、パッケージ内のクラスと MyClass のサブクラスである他のクラスのみに表示されます。
  • MyClassこれは「デフォルト アクセス」または「パッケージ プライベート」アクセスです。MyClass は、同じパッケージ内のクラスにのみ表示されます。
  • private MyClassこのクラスは、同じ .class ファイル内にあるクラスを除いて、他のクラスからは見えません。

デフォルト アクセスとプライベート アクセスは、エクスポートされていない可視性レベルと見なされます。これらの可視性レベルを持つクラスは、実装の詳細が API の一部としてエクスポートされないため、自由に変更できます。

パブリックおよび保護されたアクセスは、エクスポートされた可視性レベルと見なされます。一般に、API の一部としてクラスをエクスポートすると、それを「永久に」サポートし続けることが期待されます。

于 2013-10-14T19:56:02.680 に答える