为什么多态性在Java中很有用?

为什么多态性在Java中很有用?,java,polymorphism,Java,Polymorphism,为什么我们要说基本b=新派生,而派生b=新派生?就我所知,如果我错了,请纠正我如果我们做了后者,我们仍然可以将其添加到arrayList中,对吗 你是对的,但是将数组列表声明为taking Base将允许存储Base、Derived及其所有子级。你是对的,但是将数组列表声明为taking Base将允许存储Base、Derived及其所有子级。这是我最近不得不处理的问题 假设我有一个父类敌人,子类是EnemyBlob和EnemyBat。现在让我们假设我想将所有敌人存储在ArrayList中。如果

为什么我们要说基本b=新派生,而派生b=新派生?就我所知,如果我错了,请纠正我如果我们做了后者,我们仍然可以将其添加到arrayList中,对吗

你是对的,但是将数组列表声明为taking Base将允许存储Base、Derived及其所有子级。

你是对的,但是将数组列表声明为taking Base将允许存储Base、Derived及其所有子级。

这是我最近不得不处理的问题

假设我有一个父类敌人,子类是EnemyBlob和EnemyBat。现在让我们假设我想将所有敌人存储在ArrayList中。如果我尝试使用ArrayList,那么我需要为每种类型的敌人使用一个单独的ArrayList

但是,如果我使用ArrayList,那么我可以向其中添加EnemyBlob和EnemyBat

此外,这允许您使用不同类型的对象

ArrayList是List的一个子类。如果将列表的所有位置都定义为ArrayList,那么如果获得不同类型的列表(例如CopyOnWriteArrayList),则无法使用它


基本上,多态性使您能够灵活地使用和重写类。

这是我最近不得不处理的一个问题

假设我有一个父类敌人,子类是EnemyBlob和EnemyBat。现在让我们假设我想将所有敌人存储在ArrayList中。如果我尝试使用ArrayList,那么我需要为每种类型的敌人使用一个单独的ArrayList

但是,如果我使用ArrayList,那么我可以向其中添加EnemyBlob和EnemyBat

此外,这允许您使用不同类型的对象

ArrayList是List的一个子类。如果将列表的所有位置都定义为ArrayList,那么如果获得不同类型的列表(例如CopyOnWriteArrayList),则无法使用它


基本上,多态性使您能够灵活地使用和重写类。

这两者之间没有区别:

Base b = new Derived();
list.add(b);

// or

Derived b = new Derived();
list.add(b);
所以,选择你喜欢的

在其他情况下存在差异-以下是一些示例:

// this works fine
Base b;
if(randomNumber > 5)
    b = new Derived1();
else
    b = new Derived2();

// this does not compile
Derived1 b;
if(randomNumber > 5)
    b = new Derived1();
else
    b = new Derived2();

// this also works fine, but if you change Base to Derived1 it will not compile
void foo(Base b) {
    System.out.println("Type is "+b.getClass().getName());
}
void bar() {
    foo(new Derived1());
    foo(new Derived2());
}

这两者之间没有区别:

Base b = new Derived();
list.add(b);

// or

Derived b = new Derived();
list.add(b);
所以,选择你喜欢的

在其他情况下存在差异-以下是一些示例:

// this works fine
Base b;
if(randomNumber > 5)
    b = new Derived1();
else
    b = new Derived2();

// this does not compile
Derived1 b;
if(randomNumber > 5)
    b = new Derived1();
else
    b = new Derived2();

// this also works fine, but if you change Base to Derived1 it will not compile
void foo(Base b) {
    System.out.println("Type is "+b.getClass().getName());
}
void bar() {
    foo(new Derived1());
    foo(new Derived2());
}

是的,但是为什么要说Base b=新派生的;arr.addb;代替衍生b=新衍生;arr.addb;?Base b将有机会被以Base为参数的方法和对象使用,而派生b将仅可由以DEVIDED为参数的更专门的方法使用。在您的情况下,它可能没有用处,因为您只是将它们放在一个列表中;arr.addb;代替衍生b=新衍生;arr.addb;?Base b将有机会被以Base为参数的方法和对象使用,而派生b将仅可由以DEVIDED为参数的更专门的方法使用。在您的情况下,它可能没有用处,因为您只是将它们放在一个列表中。因此,实际的实现类仅在一个位置定义,因此您可以在不破坏所有内容的情况下对其进行更改。你问题中的“Java”部分毫无意义。它在所有拥有它的语言中都很有用。因此,实际的实现类只在一个地方定义,因此您可以在不破坏所有内容的情况下对其进行更改。你问题中的“Java”部分毫无意义。它在所有的语言中都是有用的。最后一句话说了所有的最后一句话说了所有的