子类中成员变量不存在重写的理解

子类中成员变量不存在重写的理解

问题描述:

子类中成员变量不存在重写

我记得这个知识点老师在课程中提到过,具体哪一节我忘记了,这个知识点其实很重要,我甚至在自己的学习笔记中都没有记录,只是课程看过后有点印象,当时觉得很简单就忽略过去了,知道我碰到之后的题目才回想起来这个知识点,然后在这里谈一下我的看法。

尝试过的解决方式:

其实这个知识点很简单,但是我想绝大多数同学都不明白如何的不存在重写,我明明在子类中命名了与父类一模一样的相同变量名的变量呀,这个也是当初我在听这个知识点的时候问过自己的问题,但是当时我就忽略了,觉得自己都懂了。

相关代码:

Animal 父类

public class Animal {
String kind = "动物";
public void info() {
System.out.println("我是动物类");
}

public String getKind() {
return this.kind;
}
}

Monkey子类

相关代码:

public class Monkey extends Animal{
String kind = "猴子";

public void info(){
System.out.println("我是猴子");
}
}

相关代码:

测试类

public class Test {

public static void main(String[] args) {
Animal ani = new Monkey();
ani.info();
System.out.println(ani.getKind());
}

}

结果

相关代码:

​我是猴子
动物

观点一、我想通过上述的代码,做个总结,方法之所以说是存在重写,是因为,我们用父类的引用指向子类的实例来调用重写的方法的时候,我们调用的是子类实例中的方法,这就说明了我确实重写了,这就是重写的表现形式(个人认为),而我们在调用成员属性的时候,我们可以看到虽然实例是子类,但是我调用的属性kind仍然是父类中的,这就是子类成员变量不存在重写的表现,就像子类不能重写父类的静态方法是一样的


问题二、我想知道为什么会出现这样的情况,难道是因为为了在程序设计的时候更加严谨,更加符合实际的思想,避免代码过渡灵活所以设计成这样吗


以上就是个人的理解,望老师耐心观看,就观点一、问题二做解答,如有错误请指出

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿慧 2021-01-03 10:45:27

同学你好,

1、在调用成员属性时,也存在重写。同学代码中调用kind属性是父类中的,是因为子类中没有getKind()方法,这时就会调用父类中的getKind()方法。

参考代码如下:

http://img1.sycdn.imooc.com//climg/5ff12e990961322b04220458.jpg

2、同学的理解有误。子类中成员变量存在重写,这与子类重写父类中方法是一样的,这是多态的表现形式。

​祝学习愉快~

  • 提问者 WittChen #1

    老师您的理解有误,我说的是重写,你这个是伪重写

    http://img1.sycdn.imooc.com//climg/5ff14f0f089b3b9116000800.jpg


    2021-01-03 12:58:58
  • 提问者 WittChen #2

    和重新定义静态方法的道理一样,只是能定义与父类一模一样的成员属性,并不是重写,请参照继承(上)的2-7小节做解释

    2021-01-03 13:00:23
  • 提问者 WittChen #3

    可能测试类代码误导了老师,改成ani.kind

    2021-01-03 13:26:13
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师