如果没有抽象的静态字段覆盖,则无法编写简单的大小写

时间:2017-11-05 00:09:37

标签: java

想象一个简单的层次结构:

abstract class Animal {}

class Dog extends Animal {}

class Cat extends Animal {}

我想实现抽象方法makeNoise,以便Dog可以覆盖它以打印Woof!,而Cat可以覆盖它以打印Meow!。< / p>

我写了以下代码:

abstract class Animal {

    abstract void makeNoise();    

}

class Dog extends Animal {

    @Override
    void makeNoise() {
        System.out.println("Woof!");
    }

}

class Cat extends Animal {

    @Override
    void makeNoise() {
        System.out.println("Meow!");
    }

}

但我不喜欢它。我在重写方法中重复sout

我想在abstract final static中创建一个名为SOUND的{​​{1}}变量,并在子项中覆盖它:

Animal

但该代码显然不起作用。但这是一种创建这样的逻辑的方法,所以我可以创建以下代码:

abstract class Animal {

    abstract static final String SOUND;

    void makeNoise() {
        System.out.println(SOUND);
    }

}

class Dog extends Animal {

    static final String SOUND = "Woof!";

}

class Cat extends Animal {

    static final String SOUND = "Meow!";

}

更新

除了new Dog().makeNoise(); // Woof! new Cat().makeNoise(); // Meow! 我还希望静态访问声音,以便我也可以编写以下代码:

makeNoise

1 个答案:

答案 0 :(得分:4)

abstract class Animal {

    void makeNoise() { System.out.println(noise()); }
    abstract String noise();
}

class Dog extends Animal {

    @Override
    String noise() { return "Woof!"; }

}

class Cat extends Animal {

    @Override
    String noise() { return "Meow!"; }

}

这和你一样好。