Java简单类扩展案例

时间:2015-12-25 12:33:27

标签: java

ACM libray包含RandomGenerator类。一个人使用这样的类:

private RandomGenerator rgen = RandomGenerator.getInstance();

//now, use rgen

getInstance()是静态的

我正在尝试扩展该课程,但我不明白如何。

这是我的代码:

public class RandomGeneratorwithStrings extends RandomGenerator
{
    public String get_random_string(int characters)
    {
        //...
    }
}

如果我这样称呼它:

private RandomGeneratorwithStrings rgen = RandomGeneratorwithStrings.getInstance();

我得到Type mismatch: cannot convert from RandomGenerator to RandomGeneratorwithStrings.

如果我这样称呼它:

private RandomGeneratorwithStrings rgen = 
(RandomGeneratorwithStrings) RandomGeneratorwithStrings.getInstance();

我得到java.lang.ClassCastException: acm.util.RandomGenerator cannot be cast to RandomGeneratorwithStrings

3 个答案:

答案 0 :(得分:0)

因为RandomGeneratorwithStrings.getInstance();从继承的类getInstance()调用静态方法RandomGenerator方法。记住静态方法没有被覆盖,所以每当你执行getInstance()方法时,你都会从RandomGenerator调用返回RandomGenerator生成器对象的方法。因此,当您将其分配到扩展RandomGenerator的自定义类时,您将downcasting它。

答案 1 :(得分:0)

public class RandomGeneratorwithStrings extends RandomGenerator {

private static RandomGeneratorwithStrings instance = new RandomGeneratorwithStrings();

public static RandomGeneratorwithStrings getInstance() {
    return instance;
}

public String get_random_string(int characters) {
    // ...
    return "Merry Christmass";
}

}

然后你可以使用RandomGeneratorwithStrings,如RandomGenerator(然后,你就可以像使用RandomGenerator一样使用RandomGeneratorwithStrings了):

RandomGeneratorwithStrings rgen = RandomGeneratorwithStrings.getInstance();
System.out.println(rgen.nextInt());
System.out.println(rgen.get_random_string(1));

(上面错误的原因在于): RandomGeneratorwithStrings继承了RandomGenerator,所以,父类RandomGenerator无法强转为子类RandomGeneratorwithStrings,而子类RandomGeneratorwithStrings可以向上转为父类RandomGenerator。

答案 2 :(得分:0)

我会强制执行"撰写而不是继承" 做法。

public class RandomStringGenerator {
    private RandomGenerator randomGenerator;
    public String getRandomString(int chars) {
        //...
    }
}

从我的观点来看,扩展RandomGenerator并没有多大意义,因为你不会从多态中受益(使用继承你必须将RandomGenerator转换为RandomStringGenerator,因为getRandomString未在超类中定义。