阿里云【名师课堂】Java面向对象开发57 ~ 59:覆写

  • 57:方法覆写
    • 概念
    • 访问权限
    • 重载和覆写的区别
  • 58:属性覆盖(了解)
  • 59:super关键字
    • 调用父类方法
    • 调用父类属性
    • super与this
  • 覆写总结:

57:方法覆写

概念

方法覆写指的是子类定义了与父类方法名称、参数类型及个数完全相同的方法,凡是被覆写的方法不能拥有比父类更严格的访问控制权限。
范例:观察简单的方法覆写

class Person {public void printInfo() {System.out.println("【Person类】printInfo()方法") ;}
}class Student extends Person {public void printInfo() { // 注意方法名完全相同System.out.println("【Student类】printInfo()方法") ;}
}public class TestDemo {public static void main(String args[]) {Student stu = new Student() ; // 子类实例化对象stu.printInfo();}
}


使用覆写时一定要关注以下两点

  • 当前使用的对象是哪个类new的(哪个类实例化的);
  • 调用方法时,如果某方法已经被子类覆写了,则调用的一定是被覆写的方法。

访问权限

再次强调:凡是被覆写的方法不能拥有比父类更严格的访问控制权限

  • 访问控制权限:private < default < public
  • 就是说,如果父类方法使用public权限,子类方法只能是public权限;如果父类default权限,子类可以是defaultpublic
    • 这时需要关注private权限,如果父类方法被private定义,那么表示该方法只能被父类调用,对子类而言根本没有这个方法。
  • 范例:错误的覆写
class Person {void printInfo() {  // default权限System.out.println("【Person类】printInfo()方法") ;}
}class Student extends Person {private void printInfo() { // 访问权限变严格了System.out.println("【Student类】printInfo()方法") ;}
}public class TestDemo {public static void main(String args[]) {Student stu = new Student() ; // 子类实例化对象stu.printInfo();}
}
//输出:错误提示: Student中的printInfo()无法覆盖Person中的printInfo()
  • 范例:观察private权限
class Person {public void method(){this.printInfo() ;}private void printInfo() {System.out.println("【Person类】printInfo()方法") ;}
}class Student extends Person {// 这时这个方法只是子类定义的新方法,和父类一点关系没有public void printInfo() {System.out.println("【Student类】printInfo()方法") ;}
}public class TestDemo {public static void main(String args[]) {Student stu = new Student() ; // 子类实例化对象stu.method();}
}
// 这时输出为:【Person类】printInfo()方法
// 如果把父类方法private换为default或public,输出为:【Student类】printInfo()方法

结论:绝大多数情况下写重载时访问权限就用public。

重载和覆写的区别

请回顾:《阿里云【名师课堂】Java面向对象开发8:构造方法与匿名对象》中的方法重载部分。

区别 重载 覆写
英文 Overload Override
概念 方法名称相同,参数的种类、个数不同 方法名称、返回值类型、参数类型及个数完全相同
范围 发生在一个类中 发生在继承关系中
限制 没有权限要求 凡是被覆写的方法不能拥有比父类更严格的访问控制权限
  • 重载时返回值是否可以不同?

    • 方法重载时返回值可以不同,但是良好的设计上要求返回类型相一致

58:属性覆盖(了解)

当子类定义了与父类中属性名称完全相同的属性时就叫做属性的覆盖。

class Person {public String info = "it was called yellow" ;public void printInfo() {System.out.println("【Person类】printInfo()方法") ;}
}class Student extends Person {public int info = 3000 ;public void printInfo() {System.out.println(info) ;}
}public class TestDemo {public static void main(String args[]) {Student stu = new Student() ; // 子类实例化对象stu.printInfo() ;}
}


这个操作实际上没有意义,因为在实际操作中我们会用private定义属性,这时子类根本不知道父类中有哪些属性,也就不存在对父类属性进行重载操作。
结论:写属性时尽量不要有重名。

59:super关键字

在之前的子类对象实例化操作的讲解时介绍了super(),当时是子类调用父类方法时才使用。
那么在进行覆写的操作过程中,子类也可以使用super.方法()或者super.属性明确调用父类的方法或属性。

调用父类方法

范例:观察一个程序

class Person {public void printInfo() {System.out.println("【Person类】printInfo()方法") ;}
}class Student extends Person {public void printInfo() {System.out.println("【Student类】printInfo()方法") ;}
}public class TestDemo {public static void main(String args[]) {Student stu = new Student() ; // 子类实例化对象stu.printInfo() ;}
}

对于这段程序,输出是:【Student类】printInfo()方法

  • 首先,实例化子类对象stu,然后stu调用子类中的printInfo方法。
  • 因为子类覆写了父类的printInfo方法。

如果实例化操作改为:Person stu = new Person() ;,输出是:【Person类】printInfo()方法

  • 因为实例化了父类对象,直接调用父类中的printInfo方法。

如果将子类改为:

class Student extends Person {public void printInfo() {printInfo() ; // this.printInfo() ;System.out.println("【Student类】printInfo()方法") ;}
}

输出为:java.lang.StackOverflowError,即栈溢出。

  • 因为这里是递归调用,这里的printInfo() ;就相当于this.printInfo() ;
  • this起到的作用为:先在本类中查找所需要的方法,如果本类没有,则去找父类中方法进行调用。所以这里就是在自己的printInfo() ;中调用printInfo() ;

如果将子类改为:

class Student extends Person {public void printInfo() {super.printInfo() ;System.out.println("【Student类】printInfo()方法") ;}
}

输出为:

为什么?

  • 使用super关键字之后不在本类寻找方法,而是直接前往父类调用父类中的方法。
  • 这里就是先输出父类的printInfo() ;再输出自己的printInfo() ;

调用父类属性

范例:观察调用父类属性
先回顾第58讲中的属性覆盖程序,子类中的System.out.println(info) ; // info=this.info语句输出的永远是3000,因为它输出的是自己的info。
要想输出父类的info应该:在子类的printInfo方法中添加:System.out.println(super.info) ;

super与this

通过分析我们发现:super与this的使用形式上高度相似,但是二者最大区别在于:super是子类访问父类的操作,this是在本类自身中访问处理的操作。

区别 this super
概念 访问本类中的属性、方法 由子类访问父类中的属性、方法
查找范围 先查找本类,如果本类没有则调用父类 不查找本类,直接调用父类
特殊 表述当前对象 没有类似“表示父类对象”的概念

覆写总结:

  • 子类覆写父类的方法是因为父类的方法功能不足;
  • 方法覆写时统一使用public权限,注意返回值、名称的完全相同
  • 以后在子类中调用父类方法时一定加上super关键字。

阿里云【名师课堂】Java面向对象开发57 ~ 59:覆写相关推荐

  1. 阿里云【名师课堂】Java面向对象开发2:面向对象简介

    阿里云[名师课堂]Java面向对象开发2:面向对象简介 编程语言发展阶段 编程语言发展阶段 面向机器语言:汇编语言 面向过程语言:C语言.FORTRAN等 面向对象语言:Java等 面向过程的核心是编 ...

  2. 阿里云基础设施事业部Java岗、腾讯TEG后台开发岗面经(4.22更新,拿到AT双Offer)

    阿里云基础设施事业部Java岗.腾讯TEG后台开发岗面经

  3. 名师讲坛——Java Web开发实战经典基础篇(JSP、Servlet、Struts、Ajax)

    [书名]<名师讲坛--Java Web开发实战经典基础篇(JSP.Servlet.Struts.Ajax)> [作者]李兴华.王月清 [ISBN]9787302231585 ­}:YKf: ...

  4. 重磅发布 , 阿里云全链路数据湖开发治理解决方案

    阿里云重磅更新全链路数据湖解决方案,主要包含开源大数据平台E-MapReduce(EMR) + 一站式大数据数据开发治理平台DataWorks + 数据湖构建DLF + 对象存储OSS等核心产品. 近 ...

  5. Mac系统下连接阿里云并运行java程序

    文章目录 Mac系统下连接阿里云并运行java程序 第一步:连接服务器并查看当前服务器中java的版本 第二步:自行安装jdk环境 第三步:安装上传的jdk,并配置环境变量 第四步:创建.java程序 ...

  6. 基于搜狐云景的java语言开发技巧

    基于搜狐云景的java语言开发技巧 坊间盛传国内最牛X的paas公测了,上网搜了下,是搜狐云景,我试用了下,以下是我对搜狐云景的初体验,和辛苦耕耘的码农分享.在云景上开发java项目,和你现在的工作没 ...

  7. I.MX6ULL开发板基于阿里云项目实战 3 :阿里云iot-SDK 移植到arm开发板

    上一篇博客讲的是创建产品和设备,本讲,我们将阿里云iot-SDK 移植到arm开发板. 参考资料: https://code.aliyun.com/edward.yangx/public-docs/w ...

  8. 名师讲坛—Java Web开发实战经典基础篇(JSP、Servlet、Struts、Ajax)

    名师讲坛-Java Web开发实战经典基础篇(JSP.Servlet.Struts.Ajax) 基本信息 作者: 李兴华    王月清   出版社:清华大学出版社 ISBN:9787302231585 ...

  9. 阿里云IoT工业互联网应用开发平台上线 一站式构建工业互联网应用

    今天,制造业发展主要面临生产成本不断上升,供应链协同低效,产销数据脱节三个痛点,智能制造成为关键.因此如何借助工业互联网平台,快速.高效部署相关应用,推动智能制造转型,已经成了工业制造业的核心能力. ...

最新文章

  1. java高并发(十)线程不安全类与写法
  2. 以太网速率怎么手动设置_OPENWRT-KOOLSHARE软路由,一级/单臂/二级/旁软路由设置单臂路由联网教程...
  3. python scapy模块安装_python scapy模块安装与依赖模块
  4. Android 7.0后 播放U盘中的视频文件的解决方案
  5. Tokenisation word segmentation sentence segmentation
  6. 那年学过的Web前端笔记
  7. java nio connect_服务器或客户端上的Java NIO套接字在什么时...
  8. 迎接蜕变,期待 Internet Exploer 9
  9. 软件架构师必需要了解的 saas 架构设计?
  10. 计算机链接局域网,window7连接局域网的方法
  11. 计算机专业黑板报迎新,新学期迎新黑板报
  12. 《数据库原理与应用》马春梅 禹继国 黄宝贵 祝永志 编著 P30 六个表的实现
  13. python简单应用!用爬虫来采集天猫所有优惠券信息,写入本地文件
  14. 个人博客标签和文章的表结构设计
  15. 第2章 Python 数字图像处理(DIP) --数字图像基础2 - 图像感知要素 - 图像取样和量化 - 空间分辨率和灰度分辨率
  16. 20189220 余超《Linux内核原理与分析》第六周作业
  17. java mina spring_Mina入门教程(二)----Spring4 集成Mina
  18. docker 常用命令全解
  19. 高仿墨迹天气-天鹰气象
  20. pt工具的使用(4) pt-osc的使用

热门文章

  1. 开心农场的20条人生启示
  2. java 0x01什么意思_null有哪些常见的意思?(Java中的null到底是什么意思?)
  3. 3维IC的三种实现方法【读论文】
  4. Cannot find module 'node-sass'
  5. 永宏协议转换网关WTGNet-FBS
  6. ANSYS apdl命令流笔记4----非线性材料的定义
  7. 互联网行业2015校园招聘
  8. 发那科机器人回原位置先上升_【干货】发那科机器人的备份与还原、零点校准,工程师必知!...
  9. 商业银行业务分类[整理]
  10. 猎头、培训与咨询的价值(2)【补1】——北漂18年(93)