当前位置: 首页 > 知识库问答 >
问题:

java中的多态性:为什么我们将父引用设置为子对象?

危钱明
2023-03-14

我想了解将父对象引用设置为子对象的用例。示例:Dog类扩展了Animal类。(请注意,没有接口)我通常会创建一个Dog对象,如下所示:

Dog obj = new Dog();

现在,因为Dog是动物的一个子类,它已经可以访问动物的所有方法和变量。那么,这有什么区别:

Animal obj = new Dog(); 

请提供一个适当的用例及其使用的代码片段。请不要写关于“多态性”或“接口编码”的理论文章!

代码:

public class Polymorphism {
    public static void main(String[] args){
        Animal obj1 = new Dog();
        Dog obj2 = new Dog();
        obj1.shout(); //output is bark..
        obj2.shout(); //output is bark..        
    }   
}

class Animal{
    public void shout(){
        System.out.println("Parent animal's shout");
    }       
}

class Dog extends Animal{
    public void shout(){
        System.out.println("bark..");
    }
}

class Lion extends Animal{
    public void shout(){
        System.out.println("roar..");
    }
}

class Horse extends Animal{
    public void shout(){
        System.out.println("neigh");
    }
}

两种情况下的输出相同。那么为什么我们要将父引用设置为子对象呢?

共有3个答案

巢安澜
2023-03-14

一般来说,你会知道java铸造/oop的概念。

DogAnimal的一种类型,因此您可以将其分配给动物。

但是您不能将动物分配给。因为它可以是任何其他动物,比如猫。如果您确定对象是,则可以将其铸造到动物。如果动物属于类型,则您无法对山羊进行魔法施放。

上官砚文
2023-03-14

这是一项原则的实施-

程序到接口,而不是实现。

例如,如果您设计了一个方法来接受Animal类型的引用,那么将来您可以轻松地将=Cat实现传递给它(当然前提是CatAnimal的子类型)。

也就是说-

public void doSomethingWithAnimal(Animal animal) {
    // perform some action with/on animal
}

比以前灵活得多-

public void doSomethingWithAnimal(Dog d) {
    // your code
}

因为对于第一种方法,您可以轻松地执行以下操作-

doSomethingWithAnimal(new Cat());

如果您决定创建新的Cat类型,则从动物继承。

高建本
2023-03-14

让我编码一些时间。

List<String> list = new ArrayList<String>;
list.doThis();
list.doThat();

等等,我疯了。我想使用LinkedList而不是ArrayList

List<String> list = new LinkedList<String>;
list.doThis();
list.doThat();

是的,我只需要更改申报部分。不需要触摸我所有的代码。多亏了对接口和超级类的编程。

 类似资料:
  • 我在问一个很简单的问题,但我有点困惑。 假设我有一个类: 并具有另一个类: 最后是我的Main.java类 如果我将子对象创建为 则对象可以访问变量。 我的问题是: 仅提供父类的变量的访问权限。那么这条线的确切用途是什么?? 并且当它使用动态多态性时,那么为什么在这样做之后,child类的变量是不可访问的

  • 考虑类家长: 和类儿童: 如果我在应用程序中创建一个新的子对象,并将其放入父对象的children字段中,然后持久化父对象,为什么Hibernate不自动更新子对象的Parent字段(以便设置parentID列)?

  • 问题内容: 我知道弱引用是垃圾收集器的摆布,我们不能保证弱引用会存在。我认为没有必要提供较弱的参考,但可以确定应该有一个理由。 为什么我们需要Java中的弱引用? Java中弱引用的实际(某些)用法是什么?如果您可以分享您在项目中的使用方式,那就太好了! 问题答案: 使用弱哈希图实际上通常是一个坏主意。首先,很容易出错,但更糟糕的是,它通常用于实现某种缓存。 这意味着以下内容:您的程序在一段时间内

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 我刚刚安装了Ubuntu desktop 12.04并通过以下方式安装了Java 6 JDK: 但是当我转到时,我没有看到一个名为的目录,所以我认为它根本不存在!?! 当我转到时,我看到: 我现在正试图将作为环境变量添加到中,以便从基于shell的Ant构建中访问它: ? ? 还有别的吗? 我所说的“”是指我在系统上安装的JDK6的顶级目录,无论它在哪里······

  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?