1

ミルククラスに名前とコードの静的属性を設定したいです。なぜこれが機能しないのですか?名前とコードのセッター/ゲッターをオーバーライドすることさえできません。

    public abstract class Cow {
        private static String name;
        private static String code;

    ...
     public static String getName() {
            return name;
        }

        public static void setName(String name) {
            Cow.name = name;
        }

        public static String getCode() {
            return code;
        }

        public static void setCode(String code) {
            Cow.code = code;
        }
    ...
    }

public class Milk extends Cow{

...
    static {
            Milk.setName("asdmilk");
        Milk.setCode("KDDFA");
        }
..

}
4

8 に答える 8

7

なぜこれが機能しないのですか?

のサブクラスごとに 1 セットの静的変数を取得するCowことはできず、静的メソッドをオーバーライドすることはまったくできません。基本的に、静的メンバーは多態的ではありません。

なぜこれをやろうとしているのかは明らかではありませんが、基本的に静的変数を宣言すると、変数は1 つ、完全に停止します。呼び出すMilk.setNameことは、ここで呼び出すこととまったく同じCow.setNameです。

于 2012-10-10T16:16:01.087 に答える
1

静的メソッド setName と setCode は、Milk ではなく、Cow に存在します。言うべき

public class Milk extends Cow{

...
static {
        Cow.setName("asdmilk");
        Cow.setCode("KDDFA");
    }
...

}
于 2012-10-10T16:16:49.343 に答える
0

私はあなたがこのアイデアを使ってあなたが望むことを達成できると信じています:

public abstract class Cow {

protected static HashMap<String, String> names;
protected static HashMap<String, String> codes;

//...

     public static String getName(String key) {
            return (String) names.get(key);
        }

        public static void setName(String key, String name) {
            names.put(key, name);
        }

        public static String getCode(String key) {
            return (String) codes.get(key);
        }

        public static void setCode(String code) {
            codes.put(key, name);
        }

        protected void initialize()
        {
            setName("Cow", "foo");
            setCode("Cow", "bar");
        }

        protected static void initializeClass()
        {
            initialize();
        }
}

public class Milk extends Cow {
    protected void initialize()
    {
        setName("asdmilk");
        setCode("KDDFA");
    }
}
于 2012-10-10T17:00:30.383 に答える
0

静的メソッドを継承してオーバーライドすることはできません-静的メソッドはクラス用であることに注意してください(元のクラスにのみ存在します)。それらはオブジェクト自体では動作しません(ただし、引数でオブジェクトを明示的に参照できます) . ポリモーフィズムを使用することはできません。

また、メソッドのオーバーライドはコンパイル時に決定され、オーバーロードは実行時に決定されます。

javac が「定数」または定数であると見なすように静的フィールドを保持することはできますが、それらはプログラムの存続期間を通じて変更されません (これは final 修飾子でより簡単に判断できます)。

プライベート フィールドも継承されません。

于 2012-10-10T16:18:00.370 に答える
0

補足として、Milk拡張するクラスがありますCow。通常、extendsキーワードは関係のタイプを表します。たとえばPoodle extends Dog、プードルは犬の一種です。牛乳は牛の種類ではありません。

于 2012-10-10T16:18:41.897 に答える
0

- static変数はOne per Class、すべてのオブジェクトで共有されます。

-さらに、staticメンバーはポリモーフィックではなくprivate、変数は継承されないことを思い出してください。

-したがって、静的メソッドをオーバーライドすることはできません。

于 2012-10-10T16:19:25.267 に答える
0

静的メソッドは継承されないため、スーパークラスで参照する必要があります。すべてのサブクラスで異なる名前とコードを取得する唯一の方法は、サブクラスでそれらを定義することです。これを機能させようとするのではなく、階層構造の静的状態を完全に宣言しないようにすることをお勧めします。

于 2012-10-10T16:19:36.300 に答える
0

静的ゲッターとセッターを通常のゲッター、セッターに変更します。ただし、変数は静的にしてください。

于 2012-10-10T16:16:47.867 に答える