当前位置: 首页 > 面试题库 >

Java中的上/下流

叶元凯
2023-03-14
问题内容

我试图理解Java中的向上转换和向下转换,并且对以下情况感到困惑(关于下面的代码):

首先-为什么当我包含该行时myAnimal.bark();,代码无法编译,

第二-(假设我将其注释掉myAnimal.bark();)为什么调用myAnimal.move()print
"moveDog"而不是"moveAnimal"?即使我们将其设置为类型,也不myAnimal限于Animal类中的方法,因为我们已经将其类型声明AnimalDog

任何帮助是极大的赞赏!这是代码:

    public class Animal {
        public void move() {
            System.out.println("moveAnimal");
        }

       public static void main(String[] args) {
          Dog myDog = new Dog();
          Animal myAnimal = myDog;
          myAnimal.move();
          //myAnimal.bark();
       }
    }

    class Dog extends Animal {
        @Override
        public void move() {
           System.out.println("moveDog");
        }

        public void bark() {
            System.out.println("bark");
        }
    }

问题答案:

随着这一行的隐式上行:

Animal myAnimal = myDog;

您没有做任何更改基础实例的操作myDog。您正在做的就是将其分配给继承树中一级更高级别的变量。有效地,这限制了只能调用在中定义的方法Animal,而不会改变这些方法的解析方式。

由于您已将只能使用的方法限制为在父类上定义的方法Animal,因此编译器无法解析Dog#bark(),因为它是的方法Dog,并且变量myAnimal被定义为Animal没有#bark方法的类型。

#move()是两者的方法AnimalDog,所以它解决,但它解析为上定义的方法Dog中,由于myAnimal仍然是指的一个实例Dog,尽管是向上转型。



 类似资料:
  • 摘自http://developer.android.com/guide/topics/ui/settings.html:

  • 问题内容: 我已经读过,它将在指定的时间后暂停当前正在运行的线程,在此之后它返回可运行状态,以等待其运行。 另外,如果从上下文调用,则不会释放其持有的锁。所以我想知道何时将释放锁定。如果线程进入睡眠状态,则永远无法获得运行的机会,因此它将始终保持锁定,然后保持其他线程如何进入同步的方法/块。 我不确定是否要问有效的问题。但是请帮帮我。 问题答案: 所以我想知道何时将释放锁定。 它将在退出块时(而不

  • 问题内容: 如何获取片段中的上下文? 我需要用我的数据库其构造函数采用的背景下,但并没有工作,所以我能做些什么? 数据库构造函数 问题答案: 你可以使用,返回与关联的活动。 活动是(自扩展以来)。

  • 我有以下代码: 当我尝试编译它时,会出现以下错误: 因此,我尝试使dbConnect静态如下:

  • 本文向大家介绍React.js中的上下文API,包括了React.js中的上下文API的使用技巧和注意事项,需要的朋友参考一下 React上下文api在版本16.3或最新版本中可以安全地用于生产中。添加上下文api的原因是,如果有一系列子组件,则避免传递prop。 在不使用上下文api的情况下,我们必须将道具传递给所有中间组件。另一种替代解决方案是使用第三方库(例如Redux)来维护中央存储。 了

  • 问题内容: 我试图确保我的Rhino脚本(在Java 6下运行)很严格,以便如果脚本开发人员拼错了一个表达式,我希望抛出一个异常。当前发生的情况是该表达式仅计算为“未定义”。 根据Mozilla org https://developer.mozilla.org/en/New_in_Rhino_1.6R6的介绍,现在有一些功能可以在上下文中进行严格检查。我找不到一个可行的例子。 到目前为止,我所做