Java:@Override标签的多态性详解
Override(重写)是子类与父类的一种多态性体现。
Override允许子类改变父类的一些行为。
为什么需要Override:当父类不满足子类的一些要求时我们就需要子类对父类的一些行为进行重写。
例如:某公司里的员工的电话号码不允许对外公开,而销售人员(员工)的电话号码则需要对外公开。
这时我们就可以这样做:
Java代码
![]()
- public class Employee {
- private String mobile;
- public Employee(String mobile) {
- this.mobile = mobile;
- }
- protected String showMess(){
- return "电话号码:"+mobile;
- }
- }
员工类的showMess方法是protected的,所以位于其他包的对象是访问不到的。
然后定义一个销售人员的类(Sales),并继承Employee类
Java代码
![]()
- public class Sales extends Employee{
- //子类除了具有父类的一些属性,也可以有自己的一些属性
- private String msn;
- public Sales(String mobile,String msn) {
- super(mobile);
- this.msn = msn;
- }
- @Override
- public String showMess() {
- return super.showMess()+"==msn:"+this.msn;
- }
- }
注意这时被覆盖的showMess方法的访问级别是public,可以被任何其他对象访问到。
关于Override有几点要注意的地方:
1.被覆盖方法的访问控制级别可以不一样。
例如上例父类的showMess方法的访问级别为protected的,而子类覆盖的showMess方法访问级别则为public的。
但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。
2.方法被定义为private或static或final的则不能被覆盖。
3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。
4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。
Java代码
![]()
- public class Parent {
- private int num(int i,int j){
- return i+j;
- }
- public static void main(String[] args) {
- Parent p = new Child();
- System.out.println(p.num(1, 2));
- }
- }
- class Child extends Parent{
- public int num(int x,int y){
- return x-y;
- }
- }
这段代码的执行结果为什么呢?如果你回答-1则错了,正确答案是3。
为什么呢?因为父类的num方法是private的,所以不能被覆盖,所以子类的num方法不是一种Override,因此在子类找不到被覆盖的num方法就会执行父类的num方法。所以结果输出为3.
Java代码
![]()
- public class Parent {
- public int test(){
- //执行子类的num方法
- return num(1,2);
- }
- protected int num(int i,int j){
- return i+j;
- }
- public static void main(String[] args) {
- Parent p = new Child();
- System.out.println(p.test());
- }
- }
- class Child extends Parent{
- public int num(int x,int y){
- return x-y;
- }
- }
那么这段代码的执行结果是-1,因为父类test方法调用的是子类的num方法。
Java:@Override标签的多态性详解的更多相关文章
- [译]Java Thread join示例与详解
Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...
- java对象池commons-pool-1.6详解(一)
自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...
- Java网络编程和NIO详解8:浅析mmap和Direct Buffer
Java网络编程与NIO详解8:浅析mmap和Direct Buffer 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NI ...
- java.util.logging.Logger使用详解 (转)
http://lavasoft.blog.51cto.com/62575/184492/ ************************************************* java. ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO
Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...
- Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型
Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...
- Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...
- 【转】java的动态代理机制详解
java的动态代理机制详解 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们 ...
随机推荐
- php基础。php与js的不同
1 . PHP拼字符串用的是点. js用+号. 2. php文件要放在wamp文件里面的www里面. 3. php与js的嵌入方式相同,只是嵌入的标记不一样. 4. php输出语法用echo.可 ...
- css动画过渡
css动画过渡css代码: .div03{ width:100px;height:100px;background: rebeccapurple;color: #fff; -webkit-transi ...
- JS模拟类的实现
http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html
- Callable+Future+newFixedThreadPool的应用
最近在处理很多的数据,数据量比较大,但是处理的相对简单一些,没有什么复杂的业务逻辑,然后就使用了多线程去处理.因为一直停留在Thread和Runnable的知识中,项目中使用Callable,刚好可以 ...
- SpringMVC详解(五)------参数绑定
参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢?下面我 ...
- BotVS开发基础—2.11 API绘制图表
代码 import time chart = { '__isStock': True, # 标记是否为一般图表,有兴趣的可以改成 false 运行看看. 'tooltip': {'xDateForma ...
- Andrew Ng机器学习课程笔记--week9(下)(推荐系统&协同过滤)
本周内容较多,故分为上下两篇文章. 本文为下篇. 一.内容概要 1. Anomaly Detection Density Estimation Problem Motivation Gaussian ...
- 一起来学Go --- (go的枚举以及数据类型)
枚举 枚举指一系列的相关的常量,比如下面关于一个星期的中每天的定义,通过上篇博文,我们可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在go语言中通常用于定义枚举值.go语言并不支持众多 ...
- Android辅助功能原理与基本使用详解-AccessibilityService
辅助功能原理与基本使用详解 本文主要介绍辅助功能的使用 辅助功能基本原理 辅助功能基本配置和框架搭建 辅助功能实战解析 辅助功能基本原理 辅助功能(AccessibilityService)其实是 ...
- 数据结构-环形队列 C和C++的实现
队列: 含义:是一种先入先出(FIFO)的数据结构. 当我们把数据一个一个放入队列中.当我们需要用到这些数据时,每次都从队列的头部取出第一个数据进行处理.就像排队进场一样,先排队的人先进场. 结构如下 ...