0

OKみんな、今まで(そして私は初心者なので)手続き型プログラミングに基づいてJavaをプログラミングしていましたが、それは素晴らしかったですが、Javaをボスのように使う時が来ました。

練習としてコードを書きながら、OOPの概念を学んでいます。私が理解していないのは、この方法でいくつかのオブジェクトを作成した場合です。

    Contact first = new Contact(25, "Yosi", "Male");
    System.out.println("Age of contact " + first.toString() + " is - "
            + first.getAge() + " " + first.getName());

    Contact second = new Contact(22, "lisa", "Femal");
    System.out.println("Age of contact " + second.toString() + " is - "
            + second.getAge() + " " + second.getName());

    Contact third = new Contact(34, "Adam", "Male");
    System.out.println("Age of contact " + third.toString() + " is - "
            + third.getAge() + " " + third.getName());

結果は次のようになります。

Age of contact Contact@173f7175 is - 25 Yosi
Age of contact Contact@4631c43f is - 22 lisa
Age of contact Contact@6d4b2819 is - 34 Adam

しかし、最初の連絡先をもう一度印刷しようとすると、最後に作成されたオブジェクトの値が取得されます。つまり、このコードの場合:

    Contact first = new Contact(25, "Yosi", "Male");
    System.out.println("Age of contact " + first.toString() + " is - "
            + first.getAge() + " " + first.getName());

    Contact second = new Contact(22, "lisa", "Femal");
    System.out.println("Age of contact " + second.toString() + " is - "
            + second.getAge() + " " + second.getName());

    Contact third = new Contact(34, "Adam", "Male");
    System.out.println("Age of contact " + third.toString() + " is - "
            + third.getAge() + " " + third.getName());

    System.out.println("Age of contact " + first.toString() + " is - "
            + first.getAge() + " " + first.getName());

結果は次のようになります。

Age of contact Contact@173f7175 is - 25 Yosi
Age of contact Contact@4631c43f is - 22 lisa
Age of contact Contact@6d4b2819 is - 34 Adam
Age of contact Contact@173f7175 is - 34 Adam

さまざまなオブジェクトを確認できるように、オブジェクト文字列表現を追加しました。新しいオブジェクトを作成していると思いましたが、各オブジェクトには独自のインスタンス値がありますか?説明してもらえますか?

これは連絡先クラスです:

public class Contact {

    private static int age = 0;
    private static String name = "Unknown";
    private static String gender = "Male";

    public Contact(int a, String n, String g) {
        age = a;
        name = n;
        gender = g;

    }

    public Contact() {
    }

    public static int getAge() {

        return age;
    }

    public static String getName() {

        return name;
    }

    public static String getGender() {

        return gender;
    }

    public static void setAge(int a) {

        age = a;

    }

    public static void setName(String n) {

        name = n;
    }

    public static void setGender(String g) {

        gender = g;
    }

}

静的修飾子を削除すると、「非静的フィールドへの静的参照を作成できません」というエラーが表示されることに注意してください。

4

3 に答える 3

10

staticインスタンス変数やメソッド (age、getAge、name、getName) から修飾子を削除します。

于 2012-06-28T08:10:40.887 に答える
4

これは、静的変数を誤って使用した場合に発生する可能性があります。

class Stat {
  static String name;

  Stat(String n) {
    name = n;
  }
}

上記のクラスの例では、すべてのインスタンスが に対して同じ値を共有しますname

インスタンス メンバーに非静的変数を使用します。

class Stat {
  String name;

  Stat(String n) {
    name = n;
  }
}
于 2012-06-28T08:13:11.367 に答える
1

Yosi.Static 修飾子は、フィールド (およびメソッド) をオブジェクトではなくクラスに結び付け、クラス (連絡先) の各オブジェクトは同じ値を共有します。

Newでインスタンス化するたびに、この値が更新されます。したがって、4 回目に印刷した値は、3 回目に更新した値になります。それはそのような印刷です。

私があなたのコードを見ているように、どこからでも static を削除すれば、あなたのコードはあなたが望むように動作します。

于 2012-06-28T08:34:53.450 に答える