2

私はJavaOOプログラミングに比較的慣れていないので、これに似た質問を確認しましたが、私の質問に直接答えているようには見えません。

基本的に、クラス内のデータメンバーがプライベートとして宣言されている場合、その同じクラス内からのみアクセスできることを理解しています。

私の講師は、すべての属性をプライベートとして宣言する必要があると常にアドバイスしています-これはなぜですか?

今、私はGETメソッドの使用に精通していますが、私の質問は、別のクラスからPUBLIC'get'メソッド(前述の属性を返す)を呼び出すことによって、それ自体のクラスの外部でプライベート属性にアクセスできるかどうかです。

例えば:

public class Class()
{

    private int number = 0;

    public Class()
    {
    }

    public int getNumber()
    {
        return number;
    }

}

そして、別のクラスから:

public class Class2()
{

    Class class = new Class();

    public void showNumber()
    {
        System.out.print(class.getNumber());
    }
}

コードの2番目のブロックでは、Class2内のshowInt()のメソッドが、実際にClassからプライベート属性にアクセスできるようになりますか?

一般に、属性またはメソッドをパブリックまたはプライベートとして宣言する必要があるかどうかを判断するのに本当に苦労していると思います。

従うべき特定の経験則はありますか?

レスポンダーにご協力いただきありがとうございます。

敬具

4

5 に答える 5

4

私の講師は、すべての属性をプライベートとして宣言する必要があると常にアドバイスしています。

良いアドバイス。この規則には例外がありますが、私はこれから始めます。

クラス内のデータメンバーがプライベートとして宣言されている場合、その同じクラス内からのみアクセスできることを理解しています。

そのアクセス可能

  • 同じファイル内のネストされたクラス。
  • リフレクションによるアクセス。

コードの2番目のブロックでは、Class2内のshowInt()のメソッドが、実際にClassからプライベート属性にアクセスできるようになりますか?

この場合、事実上はい。ゲッターを使用すると、フィールドの名前を変更したり、定数や計算に置き換えたり、ログに記録したりすることができ、Class2は知る必要がありません。

于 2012-08-30T11:48:39.093 に答える
2

はい、パブリックアクセサーを作成すると、プライベートフィールドにアクセスできます。

重要なのは、実装を非表示にして、実装者として、クラスのユーザーにコードの変更を強制することなく、後で別のタイプのフィールド(または間接参照、動的計算)を使用することを決定できるようにすることです。

また、セッターを提供せずにゲッターを提供することもできます(その場合、フィールドはクラス外からのみ読み取られます)。

多くのものはあなたのコードでコンパイルされないでしょう:

  • メソッドを呼び出すための括弧を追加します(getInt)
  • クラスは予約語です
  • クラスをClassと呼ぶことはできず、あなたが行ったように宣言されません

質問をする前に、エディター(Eclipseなど)でコンパイルコードを作成することをお勧めします。このタスクは、おそらく問題の少なくとも一部を理解するのに役立ちます。

于 2012-08-30T11:47:59.820 に答える
2

重要な点は、パブリックメソッドは、メンバー自体へのアクセスを許可せずに、プライベートメンバーの現在の値getのみを返すことです。これは、どういうわけかメンバーを「取得」してその値を変更できないことを意味します。

于 2012-08-30T11:52:34.450 に答える
1

はい。

ただし、メソッドを呼び出す必要があります(classクラス名として使用することはできません)。

public class Class2()
{

    Class myClass = new Class();

    public void showInt()
    {
        System.out.print(myClass.getInt());
    }
}

プライベートメンバーにはアクセスできませんが、値のコピーを受け取ります。この場合、属性ではなく、メソッドgetInt()にアクセスします。属性にアクセスしようとすると、次のようになります。

public class Class2()
{

    Class myClass = new Class();

    public void showInt()
    {
        System.out.print(myClass.x);
    }
}

アクセスは許可されません。

于 2012-08-30T11:49:28.710 に答える
0

簡単な答え:いいえ。

すべてを非公開にする一般的な理由は、クラスのユーザーが想定外の方法で変更できないようにするためです。

できることは、getterメソッドとsetterメソッドを定義することです。一般的に、ゲッターのみを公開するのが最善です。

private int foo;

public int getFoo(){
  return foo;
}

このように、人々はそれを見ること fooができますが、変えることはできません。

于 2012-08-30T11:49:44.950 に答える