-2

複数のメソッドとインスタンスに関する一連のチュートリアルに従っています。著者は、いくつかの要素について詳細を説明しませんでした。

メソッド setName を「public void」に入れてから、「public String getName」を使用して戻り値を取得するのはなぜだと思いますか。なぜ彼は return randomName を public void 内に配置し、メソッドが文字列 g を宣言すると言って public void にしなかったのですか?

public class voidvoid {

private String randomName;

public void setName(String name){
    randomName = name;

}
public String getName () {
    return randomName;
}

public void saying () {
    System.out.printf("you are %s", getName());
}


}
4

5 に答える 5

3

それはカプセル化と呼ばれます。

オブジェクトの内部を非表示にすると、ユーザーがコンポーネントの内部データを無効または不整合な状態に設定できなくなり、オブジェクトの整合性が保護されます。カプセル化の利点は、開発者がソフトウェア コンポーネント間の相互依存性を制限できるようにすることで、システムの複雑さを軽減し、堅牢性を高めることができることです。

詳細: http://en.wikipedia.org/wiki/Encapsulation_ (オブジェクト指向プログラミング)

于 2012-09-10T00:08:09.077 に答える
1

メソッドがクラスの属性を設定するとき、それはsetterメソッドと呼ばれます:

public void setName(String name)

このメソッドを使用してのみクラスの属性を設定できるrandomenameため、通常は戻り型を持つ必要はありません。ただし、必要に応じて、必ずリターンタイプを追加できます。そのような :

//this method will return true if the `randomname` was not set previously 
//otherwise false
public boolean setName(String name) {
    if (null == randomname )  { 
        randomname = name;
        return true;  
    }
    else return false;    
}

また、setterメソッドと同様に、メソッドを使用して属性を取得できる場合は、通常、メソッドと呼ばれgetterます。

public String getName(String name)

Sayingメソッドは、randomname属性を出力するために使用されます。randomnameプライベートであるため、クラススコープの外側を印刷できないため、これが必要でした。

//this will print the value of randomname
public void saying ()

//another scenario
voidvoid foo = new voidvoid () ;
foo.setName("Hello world") ;

//this line will generate an erro
System.out.println (foo.randomname) ; 

//this will compile fine
foo.saying () ;

//you can also achieve the same result using getName
System.out.println (foo.getName() ) ; 

属性のセッター/ゲッターメソッドを持つことは、private属性がmandatory必要な場合ですが、retrieve/set属性の場合ですが、私の意見では、これはそれを持つことです。optionalpublicgood practice

于 2012-09-10T00:29:23.903 に答える
1

public void を使用して変数の値を設定し、 public を使用して変数の値を取得するのが「正しい」方法です。このトピックの詳細については、「Java のゲッターとセッター」を検索してください。基本的に、これにより、変数の値を取得および設定するという点で、保存された名前へのパブリック アクセスが提供されます。メソッド say() は、getter メソッド (この場合は getName()) の使用法を示しています。変数自体がプライベートに宣言されていることに注意してください。これは、このクラスを拡張しない限り、getter と setter を使用しない限り、このクラスの外部から変数にアクセスできないことを意味します。たとえば、Fred という名前が気に入らないとします。setName(String name) メソッド内で次のように言えます。

if(name.equals("Fred") {
   randomName = "Jon Doe";
}

誰かが「Fred」という名前を設定しようとすると、代わりに「Jon Doe」として保存されます。変数に直接アクセスできる場合は、いつでも値を「Fred」に設定できます。これは、メソッドを通じて変数に入る内容を完全に制御できることを意味します。

于 2012-09-10T00:16:11.987 に答える
0

なぜ彼は return randomName を public void 内に配置しなかったのですか

質問がわかりません。彼はそれをpublic static String getName()メソッド内に配置しました。彼はそれを他にどこに置くことができますか?

public void で、メソッドが文字列 g を宣言すると言っていますか?

インスタンスメンバーではなくローカル変数になるため、別のメソッドで設定できませんでした。

于 2012-09-10T05:02:35.350 に答える
0

カプセル化されたものの価値をエンドユーザーに示すだけではありません。多くのプログラムでは、stdout (System.out が出力を出力する場所) への出力がエンド ユーザーに表示されることはありません。オブジェクトはString後で参照するために必要になる場合があるため、標準出力に出力するのではなく、それを引き出す方がはるかに有益です。

と - これらはそれぞれアクセサgetNameミューテータです。setName

アクセサーは特定の変数に関する情報を取得する必要があるため、期待される戻り値の型は、必要な変数の型です。を取得しているので、変数が であるため、 が返さStringれると予想されます。getNameStringrandomNameString

ミューテーターは、内部変数の値を変更するだけでよく、多くの場合、何らかの条件で変更されます。ここでは何も返す必要がないため、戻り値はvoidです。多くの場合boolean、成功または失敗を示すために返されるミューテーターを目にしますが、私が見た例では、その戻り値はほとんど無視されています。

于 2012-09-10T00:17:09.613 に答える