1

私は非常に新しく、Javaいくつかの概念を理解しようとしています。私は何冊かの本を読んでいますが、同じ場所でつまずき続けています。次のコードを見てください。

package Grade;
import static java.lang.System.out;
import java.util.*;

public class GradeBook {

private String courseName;

public void setCourseName (String name) {
    courseName = name;

}
public String getCourseName() {
    return courseName;
}

public void Display() // needs a string to run
{
out.println("Welcome to:" + getCourseName() );  
}
}

setCourseName()なぜ( String name ) が必要なのか、その値をどこから取得するのかはわかりません。誰かがこれを素人の言葉で説明しようとすることができれば、それは大歓迎です。

4

7 に答える 7

5

成績表の話

GradeBookには秘密があります。courseNameというprivateメンバー変数です。

ここに画像の説明を入力

Gradebook:この変数に触れるのは私だけです!

コンコン。ティーチャークラスです。

先生:こんにちは、あなたがGradeBookクラスであることがわかりました。今日のコースを割り当てさせてください。courseName変数を持っていると思いますか?

Gradebook:いいえ、知りません! (ゴクゴク)

考え中...うーん、どうすれば秘密をほとんど守れないのに、彼女にそのコース名を付けさせられるの?私はそれがひどく必要です。

Gradebook:わかりました、ほとんどそこにたどり着きました。courseName変数があるかどうかはわかりませんが、それはあまりにも個人的なことです。ただし、メソッドにコースを書き留めることができますsetCourseName。それは大丈夫ですか?そこから処理します。:)

実際...

setCourseNameを書くよう強制する人はいません。あなたのプログラムは問題なく動作します。courseName を作成するオプションがありますpublic

public String courseName;

しかし、それは大きなことですが、日記を芝生に置き、隣人や通行人に道を譲ることと同じです. あなたはそうしませんよね?

カプセル化、素人の言葉で。

于 2013-04-12T15:15:52.933 に答える
4

オブジェクト指向プログラミングへようこそ。あなたのメンバー変数 courseName は非公開であり、外部からアクセスすることはできません。

courseName 変数への読み取りアクセスを提供するには、getter メソッドを提供します。

public String getCourseName() { ... }

また、 courseName への書き込みアクセスを提供するには、setter メソッドを提供します。

public void setCourseName (String name) { ... }

ここで name は、値をプライベート変数に設定するために使用されているセッターメソッドに引数として渡されていますcourseName

于 2013-04-12T14:53:09.363 に答える
2

courseNameフィールドはプライベートであるため、このクラスには getter メソッドと setter メソッドを使用する必要があります。クラス外のコードはフィールドに直接アクセスできません。このクラスを使用する他のコード (通常はクライアント コードと呼ばれます) は、 に渡される引数値を提供し、setCourseNameによって返される値を使用しますgetCourseName

この単純な例では、クラスがこのように設計された理由を理解するのは困難です。courseNamepublic フィールドを簡単に作成して、クライアント コードで直接操作できるようにすることもできます。ただし、クラスが複雑になるにつれて、get/set スタイルを使用すると多くの利点が得られます。ここにあるいくつかの:

  • getter/setter メソッドを使用すると、クライアント コードがクラスの実装方法に変更されないようにすることができます。たとえば、後でコース名にある種の内部構造があり、名前の一部を別々のフィールドに保持したいと判断する場合があります。setCourseName実装方法を変更するだけでgetCourseName済み、クライアント コードを更新する必要はありません。

  • 自動化されたソフトウェア生成ツールは、プロパティのゲッターとセッターの存在に依存しています。これらのツールを使用すると、「courseName」プロパティを持つクラスを簡単にモデル化でき、適切なメソッドを使用するコードが生成されます。

  • 後で、コース名を変更すると特定の副作用 (どこかでコース カタログが更新されるなど) が発生するはずであると判断する場合があります。これらの依存関係を実装するには、setCourseNameメソッドを変更します。

一般に、オブジェクト指向プログラミングでは、デフォルトの設計では、クラスの実装を可能な限り隠し、メソッドを介してのみクラスを公開する必要があります。この原則に違反する十分な理由がある場合もありますが、これを順守することで、より堅牢なソフトウェアが得られる傾向があります。

于 2013-04-12T15:07:18.477 に答える
1

このクラス自体は決して使用しませんがsetCourseName、理論的にはプライベート変数を変更するために使用できますcourseName

于 2013-04-12T14:53:01.937 に答える
1

encapsulationおよびについてお読みくださいdata abstraction。そのプログラムのどこかで、誰かがGradeBookクラスをインスタンス化し、次にsettingそのメンバー変数をインスタンス化しています。サンプルは次のとおりです。

package Grade;  
import static java.lang.System.out;
import java.util.*;

class GradeBook {

    private String courseName;

    public void setCourseName (String name) {
       courseName = name;

    }
    public String getCourseName() {
      return courseName;
    }

   public void display()
   {
      out.println("Welcome to:" + getCourseName() );  
   }
}

public class Main {
  public static void main(String[] s) {
   // creating instance of GradeBook class
   GradeBook gb = new GradeBook(); 
   // assigning value to the instance variable 'courseName' using setter 
   // as it a private member and cannot be accessed outside the class definition.
   gb.setCourseName("java");
   // calls a public method to display the value.
   gb.display();
}
于 2013-04-12T14:55:11.400 に答える
1

その理由は、クラスの外部からプライベート属性 (courseName) にアクセスできないためです。get メソッドと set メソッドは、それぞれその値にアクセス (取得) および変更 (設定) するように設計されています。

于 2013-04-12T14:55:57.327 に答える
1

最初にコメントを投稿しました。しかし、多くの人がこの質問を誤解していると思うので、回答を投稿することにしました。

parametersゲッター、セッター、カプセル化についてではなく、実際にそれらが何のために使用されているかについて質問しているようです。

私はいくつかの検索を行い、このリンクに出くわしました: http://www.homeandlearn.co.uk/java/java_method_parameters.html

これは Java の初心者向けガイドであり、特に Java のパラメーターについて説明しています。

Java で作成するmethods場合、タスクを完了するために値が必要になることがあります。メソッドがこれらの変数を所有したり、これらの変数を継承したりしたくない可能性があります。多くの場合、メソッドに変数を与えて、簡単なタスクまたはプロセスに一時的に使用してから値を返すことができるようにするだけです。これはString nameメソッド定義に見られるもので、メソッドに渡されるパラメーター、変数です。メソッドに渡される変数の数に制限はありません。変数は、メソッドを定義した順序で割り当てられます。

たとえば、次のように定義するとします。

public void myMethod(String one, String two, String three) {
    some code;
}

そして、そのメソッドを次のように呼び出します。

myMethod("one", "two", "three");

次に、myMethod 内で、変数onetwo、およびthreeを使用して、これらの String 値にアクセスできるようになります。

クラスを介してメソッドにアクセスさせるのではなく、値を渡す必要がある理由の例は、JavaMathクラスです。電話をかけるときはMath.floor(decimalValue)、Math クラスに decimalValue を指定し、Math クラスにそれを使用して床を決定させ、それを返します。Math クラスと他のすべてのクラスの両方が常にアクセスできるようにプログラムを作成する必要はありませんdecimalValue

これですべてが説明できますか?

于 2013-04-12T15:17:09.567 に答える