为什么子类对象使用的父类方法会导致错误?

FangsMcSpicy:

我目前正在上一门有关Java的课程,试图理解我遇到的问题。假设有以下代码:

public class Parent
{
     public Parent()
     {}
}
public class Child extends Parent
{
     private int num;
     public Child
     {
          super();
          num = 1;
     }
     public int getNum()
     {
          return num;
     }
}

然后,在Parent或之外的单独类中Child

Parent a = new Child();
System.out.print(a.getNum());

应该提供以下内容的输出:

1

从我了解到,这应该没有错误运行,因为new Child()代码的部分应该规定的对象是什么类的一个实例,以及Parent a部分应预留内存空间的Parent配音对象“A”,其中一个Child对象由于它是Parent类的子类,因此将能够填充。为Parent对象保留此空间的事实只是表明,如果在Parent类和Child类中都使用不同的描述来显示方法,则Parent的方法描述将优先于Child类的方法描述(并且如果aChild对象留出的空间是一个对象(Child a =例如,人为等),则相反的描述将具有优先权

但是,我也被告知,这种情况将导致错误。我觉得我对整个继承存在着严重的误解,尽管我看上去到处似乎都能给我不同的答案和相互矛盾的数据(这很可能是由于对语言的不熟练,尽管信息仍然没有得到传达,因为这个的)。有人愿意解释为什么这段代码提供了它的响应,以及我应该如何更改这段代码中的某些内容以使其提供预期的输出以及新代码为什么起作用?先感谢您。

Arvind Kumar Avinash:

下面给出的行将不会被编译,因为您尚未getNum()在中定义Parent

Parent a = new Child();
System.out.print(a.getNum()); // Won't be compiled

一旦你定义getNum()Parent例如下面给出的

public int getNum() {
    return 0;
}

以下几行将成功编译,您将获得1以下输出:

Parent a = new Child();
System.out.print(a.getNum());

在这种情况下,引用a将能够解析getNum(),然后将检查其指向的实例。由于它指向的实例Child,因此它将返回1(从的子版本开始getNum())。

如果尚未定义getNum()Parent但仍要getNum()使用其引用进行调用,则需要将引用转换Child为以下内容,然后它将成功编译并执行:

Parent a = new Child();
System.out.print(((Child) a).getNum());

输出:

1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么一个List <父类>对象可以浇铸为子类对象?

为什么不能引用子类对象引用父类对象?

尽管子类对象调用该方法,为什么“ this”仍引用父类?

将子对象转换为父对象-由于缺少方法而导致编译时错误-为什么?

为什么父类的静态方法隐藏在子类中?

为什么不允许子类覆盖方法会导致创建不可变对象?

为什么子类化DataFrame会使原始对象变异?

为什么在Laravel模型中使用withDefault()方法会导致500服务器错误?

为什么子类会包含Puppet模块的主类?

子类的动态方法在lambda捕获中使用时会调用父类的虚拟方法/导致分段错误

为什么将函数移至默认特征方法会导致借入错误?

为什么弹出关闭方法会导致错误?(python kivymd)

为什么仅在枚举常量的可选类体内执行接口方法会导致编译错误?

为什么在Python中对数字文字调用方法会导致语法错误?

为什么使用varargs的重载方法会导致StackOverflowError?

为什么子类重写虚拟函数不能更改父类的默认函数参数?

为什么允许使用子类的构造函数实例化父类对象?

什么子类导致静态父方法?还是不可能完成任务?

为什么子类看不到父类的方法?

为什么我的 dbContext 的 Add 方法会添加 2 个父实体和 1 个子实体,从而导致 PK 约束错误

为什么子类成员不受保护?

我在子类中覆盖了一个属性的setter,但是当我在超类的init方法中调用它时,为什么子类的方法响应?

为什么在Python中子类不能使用super调用父类方法

为什么子对象调用具有 main 方法的超类的私有方法?

为什么在子类化 tf.keras 层(或模型)类时实现“调用”方法会使层(模型)对象可调用?

JS - 为什么子类方法会使用 Parent.prototype.method.call 调用父类方法?

提取 4 位与 2 位蓝牙 HEX 数据,为什么相同的方法会导致错误

为什么 readLong 方法会导致 EOFException?

为什么子类没有给构造函数添加任何额外逻辑时,我需要重写父类 DbContext 的构造函数?