Java基础对象多类型变量

时间:2010-08-22 09:47:37

标签: java oop class variables extend

我确信这与以Java为中心的OOP非常相似。在java中有一种方法可以创建一个接受所有继承子类型的基类型变量吗?就像我有;

class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}

class ABC {
    private Mammal x;

    ABC() {
        this.x = new Dog();
        -or-
        this.x = new Cat();
    }
}

我需要变量才能接受任何扩展版本,但不能用于特定的扩展版本。

我知道有一些方法,但不想使用。我可以为每个子类型创建一个属性,然后只有实际使用的一个属性。制作一个数组并将其推入那里。

获取“基类”类型变量的任何其他想法或方法?


好的,因为我知道在Java中使用多态鸭打字不是一个好主意,但因为我不认为我可以避免它。是动态使用子类方法重新分配变量的转换版本的唯一方法,即我得到一个错误;

Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
  x.bark();
} else if (x instanceof Cat) {
  x.meow();
}

说没有找到符号,但这有效;

Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
  Dog d = (Dog) x;
  d.bark();
} else if (x instanceof Cat) {
  Cat c = (Cat) x;
  c.meow();
}

最后一个是唯一的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您有以下内容:

class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}

然后DogMammal的子类型。 Cat也是Mammal的子类型。事实上,这种类型的多态性允许您执行以下操作:

Mammal x;
x = new Dog(); // fine!
x = new Cat(); // also fine!

如果实际上后来有以下内容:

class Platypus extends Mammal {...} // yes it's true!

然后你也可以这样做:

x = new Platypus(); // fine!

这种多态的子类型关系是面向对象编程的基本原则之一。

另见


instanceof类型比较运算符

假设我们有以下内容:

class Mammal { void lactate(); }
class Dog extends Mammal { void bark(); }
class Cat extends Mammal { void meow(); }

然后您可以使用instanceof类型比较运算符(§15.20.2)执行以下操作:

Mammal x = ...;

if (x instanceof Dog) {
   Dog d = (Dog) x;
   d.bark();
} else if (x instanceof Cat) {
   Cat c = (Cat) x;
   c.meow();
}
if (x != null) {
   x.lactate();
}

如果没有if-else,还有其他方法可以做到这一点。这只是一个简单的例子。

请注意,通过适当的设计,您可以避免某些类型的子类型差异化逻辑。例如,如果Mammal采用makeSomeNoise()方法,则只需拨打x.makeSomeNoise()

相关问题


反思

如果必须处理编译时未知的新类型,则可以使用反射。请注意,对于一般应用程序,几乎总有比反射更好的选择。

另见