0

私はJavaにとても慣れていません。カプセル化とアクセス方法を理解するための小さなプログラムを作成しました。コードは:

package practise;

public class EncapTest {

    private String name;
    String surname;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

package practise;

public class RunEncap {

    public static void main(String[] args) {

        EncapTest encapObj = new EncapTest();

        encapObj.setName("Prabh");
        encapObj.surname = "Rana";

        System.out.println("Name :" + encapObj.getName());
        System.out.println("Surname :" + encapObj.surname);
    }


}

ここで、別のパッケージ「practise2」を作成し、インポートを使用して「EncapTest」のオブジェクトを作成しようとすると、変数名にアクセスできますが、surnameにアクセスしようとすると、フィールドsurnameが表示されないというエラーが表示されます。 ..

package practise2;

import practise.EncapTest;

public class Runencap2 {

    public static void main(String[] args) {

        EncapTest encapObj = new EncapTest();

        encapObj.setName("Prabh");
        encapObj.surname = "Rana";     // <<<<getting error here

        System.out.println("Name :" + encapObj.getName());
        System.out.println("Surname :" + encapObj.surname);        
    }

}
4

4 に答える 4

3

フィールドにはデフォルト( package surname-private)アクセスレベルがあります。これは、このフィールドが同じパッケージで宣言されたクラスに対してのみ表示されることを意味します。

String surname; // access level implicitly sets to package-private

Javaには4つのアクセスレベルがあります。

  • 公衆
  • 保護
  • package-private(明示的な修飾子なし)
  • プライベート

クラスメンバーに明示的な修飾子がない場合は、自動的にpackage-privateに設定されます。公式チュートリアルで詳しく説明されています。

于 2013-03-10T09:18:23.530 に答える
1

これは、2つのクラスが異なるパッケージに含まれているためです。ドキュメントから:

クラスは修飾子publicを使用して宣言できます。その場合、そのクラスはすべてのクラスに表示されます。クラスに修飾子がない場合(デフォルト、package-privateとも呼ばれます)、クラスはそれ自体のパッケージ内でのみ表示されます(パッケージは、関連するクラスのグループと呼ばれます。これらについては、後のレッスンで学習します)。

メンバーレベルでは、トップレベルのクラスと同じように、同じ意味でpublic修飾子またはno修飾子(package-private)を使用することもできます。メンバーの場合、プライベートと保護の2つの追加アクセス修飾子があります。private修飾子は、メンバーがそれ自体のクラスでのみアクセスできることを指定します。保護された修飾子は、メンバーが(package-privateの場合と同様に)独自のパッケージ内でのみアクセスでき、さらに、別のパッケージ内のそのクラスのサブクラスからのみアクセスできることを指定します。

于 2013-03-10T09:22:20.660 に答える
1

Javaのアクセス指定子(public、private、protected、default)を読んで理解することをお勧めします。これらの概念を理解すること自体があなたの質問に答えます。

上記の例では、デフォルトのアクセスでインスタンス変数「surname」を宣言しています(public、private、またはprotectedとして指定されていない場合は暗黙的なアクセス指定子が使用されます)。デフォルトのアクセスでは、同じパッケージ内でのみ変数/メソッドにアクセスできるようにすることができます。その結果、クラス「RunEncap」ではアクセスできますが、変数が他のパッケージに表示されないため、「Runencap2」ではアクセスできません。さらに、優れたプログラミング手法として、変数をプライベートとして宣言し、それらにアクセスするためのゲッター/セッターメソッドを作成することをお勧めします。

アクセス指定子を理解するために参照できるサンプルリンクは次のとおりです-http://www.aoiblog.com/java-access-specifier/

于 2013-03-10T09:57:13.223 に答える
0

vmokshaのSunilkumar

より深いナビゲーションに移動してください。クラスのオブジェクトを作成し、オブジェクトで作成されたクラスのセッター/ゲッターを再度作成します。

于 2013-03-11T13:39:58.570 に答える