超类的一个引用变量可以被任何从该超类派生的子类的引用赋值。你将发现继承的这个方面在很多条件下是很有用的。例如,考虑下面的程序:

class RefDemo { public static void main(String args[]) { BoxWeight weightbox = new BoxWeight(3, 5, 7, 8.37); Box plainbox = new Box(); double vol; vol = weightbox.volume(); System.out.println("Volume of weightbox is " + vol); System.out.println("Weight of weightbox is " + weightbox.weight); System.out.println(); // assign BoxWeight reference to Box reference plainbox = weightbox; vol = plainbox.volume(); // OK, volume() defined in Box System.out.println("Volume of plainbox is " + vol); /* The following statement is invalid because plainbox does not define a weight member. */
// System.out.println("Weight of plainbox is " + plainbox.weight); }
}

这里,weightbox是BoxWeight对象的一个引用,plainbox是Box对象的一个引用。既然BoxWeight是Box的一个子类,允许用一个weightbox对象的引用给plainbox赋值。

理解是引用变量的类型——而不是引用对象的类型——决定了什么成员可以被访问。

也就是说,当一个子类对象的引用被赋给一个超类引用变量时,你只能访问超类定义的对象的那一部分。这是为什么plainbox不能访问weight的原因,甚至是它引用了一个BoxWeight对象也不行。

仔细想一想,这是有道理的,因为超类不知道子类增加的属性。这就是本程序中的最后一行被注释掉的原因。

Box的引用访问weight域是不可能的,因为它没有定义。尽管前面部分看起来有一点深奥,它是很重要的实际应用。

开课吧课堂:超类变量如何引用子类对象?相关推荐

  1. java超类 子类_Java超类引用子类对象的规律

    首先,对于JVM实现引用的一个机制是:类实例的引用就是指向一个句柄(handle)的指针,这个句柄就是一堆指针:一个指针指向一块从java堆中为分配出来内存空间:另一个指针指向一张表(实际上这个表格也 ...

  2. java多态性详解——父类引用子类对象

    Java的多态性 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作 ...

  3. java父类引用子类属性_Java多态性详解——父类引用子类对象

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  4. java 父类获取子类对象_Java多态性详解 (父类引用子类对象)

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  5. java 父类引用子类对象_java 父类引用指向子类对象

    1. 无论是泛型还是普通父类引用指向子类对象,父类引用可见范围都是父类自己的变量或函数 2. 说明见注释 代码如下:父类 package com.atguigu.spring.beans; publi ...

  6. java 父类引用子类对象_java多态,如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  7. java 调用父类的变量_java创建子类对象设置并调用父类的变量操作

    通过子类调用父类的变量,有两种方法: 1.把父类的变量设置成public: package triangle.opengl.wlz.stu.childusefathervariable; import ...

  8. java的子类对象_在Java中将子类对象分配给超类对象时会发生什么?

    在Java中将一种数据类型转换为另一种数据类型称为转换.如果将较高的数据类型转换为较低的数据类型,则称为窄化(将较高的数据类型值分配给较低的数据类型变量).char ch = (char)5;如果将较 ...

  9. 父类引用指向子类对象详解

    父类引用指向子类对象 父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal ani ...

最新文章

  1. 用Python统计分析290种零食,谁能唤起80、90后的童年回忆?
  2. [ExtJS5学习笔记]第十一节 Extjs5MVVM模式下系统登录实例
  3. 【笔记】springboot使用Spring-data-jpa
  4. 你还在为文件读写而烦恼?Python已经轻松帮你解决了(建议收藏)
  5. NGINX最新API管理模块已可用,针对内部和外部API进行了优化
  6. 从入门到深入Fiddler 2 (二)
  7. jdbc oracle clob blob long类型数据
  8. 通过程序得到数据库表之间的关联关系
  9. Android 字体ttf文件下载(含github下载地址)
  10. 诺顿企业版 V11.0
  11. Kaspersky Security Center部署
  12. 地缘剧本杀 (十一):疗伤(原创小说连载,内含语音)
  13. 如何举报YouTube视频和评论
  14. 大学竞赛经历分享之微信小程序应用开发赛(1)
  15. VScode中使用platformIO开发,编译时找不到自己的源文件(报错信息:undefined reference to )
  16. c语言windows程序设计-在windows中使用printf,Windows编程(4)-在Windows中使用printf
  17. c盘清理缓存垃圾路径
  18. 飞书接入ChatGPT,打造属于自己的智能问答助手
  19. c#上位机开发(三)——简易串口发送数据
  20. alert导致ajax数据交互问题,用ajax获得数据,可是页面显示的时不加个alert就显示不出来,随意加个alert就可以 解决办法...

热门文章

  1. [转载] Python numpy insert()、 delete()、append()函数的用法
  2. [转载] python并行处理任务_Python 并行任务技巧
  3. 39. 组合总和 ,40. 组合总和 II,216. 组合总和 III
  4. 说一下syslog日志吧~~~
  5. Winfrom窗体无法关闭问题--检查是否存在重写
  6. html标记语言 --超链接
  7. wpf的控件style
  8. 【转】移动Web开发-点击事件及页面滚动
  9. 转:Web页面通过URL地址传递参数常见问题及检测方法
  10. 【学习笔记】卡尔曼滤波中的协方差矩阵