Java学习18-- Override方法重写【★】

重点:super类 & 方法重写

★看不明白多看几遍,记住static优先级>>高于override

重写Override methods★

重写Override:child class可以覆盖father class中的method,即子类child class和父类father class有相同名称、相同参数列表和相同返回类型的方法method。当子类对象调用这个方法method时,会执行子类中的具体语句,而不是父类中的具体语句。

必须有继承关系,一般是“子类"重写"父类"的method(同名称,内芯不同)。重写是子类对父类那些允许访问的method实现过程进行重新编写(private method不行), 返回值和形参都不能改变。即外壳不变,核心重写!
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以尽量用大的,但不能进一步写小了 Public > Protected > Default > Private
4.抛出的异常: 范围,可以被缩小,但不能扩大:比如ClassNotFoundException(类找不到错误,范围相对小) --> Exception(范围相对大)

重写,子类的method名和父类method名必须要一致,方法体内部可以不同

为什么要重写
1.父类的功能,子类不一定全需要,或者不一定满足!
在IDEA里面,可以用快捷键Alt + Insert: 选择override,快速让系统帮你在子类里面抓出父类的一个功能进行override即重新覆盖写,一般写好之后系统在子类的代码里会加进一个@Override标志
类似这样

@Override
public void test() {super();//然后用户自行删除或者更改这一句的内容}
}

@Override是伪代码,表示重写(当然不写这个标志也可以),不过写上有如下好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的method方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的method方法。

举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查method方法的正确性。

@Override
public void onCreate(Bundle savedInstanceState){…….}

以上这种写法是正确的,如果你写成下面这样:

@Override
public void oncreate(Bundle savedInstanceState)
{…….}

编译器会报如下错误:
The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确的重写onCreate方法(注意oncreate大小写写错了,应该为onCreate)。而如果你不加@Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法叫做小写的oncreate

思考:同样是父类子类调用重名的method,method定义时候加了static和没加static,在结果上有什么区别?
小tips: static优先级>>高于Override

//注意: method定义没有加static关键字(可以考虑Override)
//比如fatherclass F= new childclass ()这样的语句,需要读完整句,到右侧才算结束
//符合Override,所以第一种fatherclass A = new childclass ();最后用的是childclass
//符合Override,第二种childclass B = new childclass ();最后用的是childclass父类名 a = new 子类名 ();
a.non-method1();子类名 b = new 子类名 ();
b.non-method1();public class 父类名 {
public void non-method1(){do sth non static method1};
}public class 子类名 {
public void non-method1(){do sth Override non static method1};
}

运行结果:

do sth Override non static method1
do sth Override non static method1
//注意:  method定义有static关键字(因为static优先级高,肯定不会Override了)
//第一种fatherclass A = new childclass ();A直接用左侧fatherclass
//第二种childclass B = new childclass ();B直接用左侧childclass父类名 a = new 子类名 ();
a.method3();子类名 b = new 子类名 ();
b.method3();public class 父类名 {
public static void sti_method3(){do sth method3};
}@Override
public class 子类名 {
public static void sti_method3(){do sth Override method3};
}

运行结果

do sth method3
do sth Override method3

运行分析:
如果程序写了public static void method,加了static关键字,由于JAVA内存中static和class部分会一起先加载且仅加载一次,static优先级高于Override,不用考虑重写的问题,父类名 a = new 子类名 ();这样的语句a直接取父类名。

而如果method没有static关键字,那么考虑Override,这时候属于子类重写了父类的方法,对于语句F_class A = new C_class ()这种定义的A就主要随右侧子类C_class ()的结构了。

助记:为什么static优先级高?
JVM中存储时候,除了第一部分stack先加载
第二部分method area里面有class structure和static存储区,他们在程序开始时候只加载一次,如果有method定义时候写了static,它在程序开始时候就加载了,优先级自然是高于子类重写父类的Override。
在这里插入图片描述

实例举例,思考下例输出的结果是什么?


public class testjan05{
public static void main(String args[]) {kids ki = new kids();ki.call();//non static, follow kids()(right) class, calling kidski.read_book();//static, follow kids(left) baby is reading baby bookshuman hu = new kids();
hu.call();//non static, follow new kids()(right) calling kids
hu.read_book();//non static, follow human(left) human is reading books
}
}

public class kids extends human{
//class kids是从class human那里继承的
//在主程序里 new 一个kids的时候 kids是子类
//子类kids可以指向父类human,就是父类human的引用指向了子类kidspublic void call() {System.out.println("non static calling kids");}public static void read_book(){System.out.println("baby is reading baby books");}
}

public class human {public void call() {System.out.println("non static calling human");}//public static void eat(){System.out.println("human is eating");}public static void read_book(){System.out.println("human is reading books");}
}

运行结果

non static calling kids
baby is reading baby books
non static calling kids
human is reading books

简化版举例,classA是classB的子类,他们内部都有一个叫做test的method,先在在主程序分别调用这两个classA.test和ClassB.test并观察他们的输出结果。注意,在建立new object的时候,右侧都是写的子类。

public class testjan05 {public static void main(String[] args) {A x= new A();x.sta_test();//调用的是静态的方法,那么x应该跟随左侧A class,输出为static A=>test()x.non_test();//调用的是非静态的方法,那么x应该跟随右侧子类new A的class输出为 non-static A=>test()B y=new A();//父类B的引用 可以指向子类A//static优先级高于Override,如果见到static直接按B class父类走,不用再往句子右侧读了//如果调用的non-static的方法,需要走完全语句,Override之后程序object按照右侧new A()子类走y.sta_test();//调用的是静态的方法,输出应该就是左侧B class输出为static B=>test()y.non_test();调用的是非静态的方法,输出应该就是右侧子类new A()输出为non-static A=>test()}
}

public class A extends B{public static void sta_test() {System.out.println("static A=>test()");}public void non_test() {System.out.println("non-static A=>test()");}
}
//重写Override 子类重写父类的方法 只存在于non-static类的methodpublic class B {public static void sta_test(){System.out.println("static B=>test()");}public void non_test() {System.out.println("non-static B=>test()");}}

运行结果


static A=>test()
non-static A=>test()static B=>test()
non-static A=>test()

总结

  • 当有static时:不用管Override,对于语句ClassF x= new ClassC();x直接跟着父类ClassF走

例如
A子类 extends B父类

A x = new A();
x.test();
x就是和A有关的

B y = new A();
y.test();
y就是和B有关的

  • 当删掉static时,要考虑子类Override父类(子类重写父类的同名方法)
    例如
    A子类 extends B父类

A x = new A();
x.test();
x跟new A()有关

B y = new A();//考虑子类重写父类方法
y.test();
y和new A()有关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/682183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git简单了解

文章目录 1、Git概述2、Git下载与安装3、Git代码托管服务3.1、使用码云托管服务 1、Git概述 什么是Git Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、xml文件、html页面等),在软件开发过程中被广泛使…

python+vue+django体育场地器材预约管理系统dyn9h

技术栈 后端:python 前端:vue.jselementui 框架:django Python版本:python3.7 数据库:mysql5.7 数据库工具:Navicat 开发软件:PyCharm .体育馆管理系统有管理员和用户两个角色。用户功能有场地…

springboot742餐厅点餐系统

springboot742餐厅点餐系统 获取源码——》公主号:计算机专业毕设大全

面试前的准备

面试前的准备 Java程序员校招与社招的区别 校招和社招都是企业招聘形式的一种,只是面向的对象不同。校招 只允许在校生参加,社招理论上是任何人都能参加的(包括在校生)。 但是,无论是社招还是校招,它的难度都取决于你的水平高低。…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第二套区块链系统部署与运维

第二套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 docker: 20.10.21 webase-deploy : 1.5.5 mysql: 8.0.34 子任务1-2-1: 搭建区块链系统并验证(4分) 使用build_chain.sh 脚本文件进行搭建区块链 ,要求: 四节点,默认配置,单机,docker root@192-168-19…

STM32—DHT11温湿度传感器

文章目录 一.温湿度原理1.1 时序图 二.代码 一.温湿度原理 1.1 时序图 (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分,图三对应图一的绿色部分,图四的左部分图对应图一的红色部分,图四的右部分对应图一的黄色部分。 (3)…

【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

内网穿透 | 推荐两个免费的内网穿透工具

目录 1、简介 2、Ngrok 2.1、下载安装 2.2、运行 2.3、固定域名 2.4、配置多服务 3、cpolar 3.1、下载安装 3.2、运行 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应…

CSRNET图像修复,DNN

CSRNET图像修复 CSRNET图像修复,只需要OPENCV的DNN

FastAI 之书(面向程序员的 FastAI)(三)

原文:www.bookstack.cn/read/th-fastai-book 译者:飞龙 协议:CC BY-NC-SA 4.0 第五章:图像分类 原文:www.bookstack.cn/read/th-fastai-book/0661b9d7375f45ab.md 译者:飞龙 协议:CC BY-NC-SA 4…

JAVA-多进程开发-创建等待进程

前言 在项目中,为了实现“并发编程”(同时执行多个任务),就引入了“多进程编程”,把一个很大的任务,拆分成若干个很小的任务,创建多个进程,每个进程分别负责其中的一部分任务。 这也…

Qt QWidget以及各种控件、布局 核心属性(适合入门使用时查询)

目录 1. QWidget核心属性 2. 按钮类控件 2.1 PushButton 核心属性 2.2 RadioButton 核心属性 2.3 CheckBox 和 Tool Button 核心属性 3. 显示类控件 3.1 Label 核心属性 3.2 LCDNumber 核心属性 3.3 ProgressBar 核心属性 3.4 Calendar Widget 核心属性 4. 输入类控…

正态分布-形状与特点

更多AI技术入门知识与工具使用请看下面链接: https://student-api.iyincaishijiao.com/t/iNSVmUE8/

【Typora】markdown神器之Typora无限使用安装与基本操作教程

🌼一、概述 Typora是一款轻量级的Markdown编辑器,它提供了简洁的界面和直观的操作方式,专注于让用户更加专注于写作。Typora支持实时预览功能,用户在编辑Markdown文档时可以即时看到最终的样式效果,这有助于提高写作效…

机器学习案例3:从科学论文图片中提取标题、作者和摘要

在这个项目中,我的目标是从科学论文图片中提取某些部分(标题、作者和摘要)。预期提取部分是科学论文中常见的部分,例如标题、摘要和作者。输入与最终结果。我的输入是将第一页纸转换成图像。最终结果是一个 txt 文件,其中包含标题、作者和摘要部分,如下图1和图2所示。我将…

【原创 附源码】Flutter集成谷歌支付详细流程(附源码)

最近有时间,特意整理了一下之前使用过的Flutter平台的海外支付,附源码及demo可供参考 这篇文章只记录Google支付的详细流程,相关Flutter文章链接如下: 【原创 附源码】Flutter集成Apple支付详细流程(附源码) 【原创 附源码】Flu…

【大数据Hive】hive 表设计常用优化策略

目录 一、前言 二、hive 普通表查询原理 2.1 操作演示说明 2.1.1 创建一张表,并加载数据 2.1.2 统计3月24号的登录人数 2.1.3 查询原理过程总结 2.2 普通表结构带来的问题 三、hive分区表设计 3.1 区表结构 - 分区设计思想 3.2 操作演示 3.2.1 创建分区表…

解决MAC连上wifi或热点却不能上网问题

解决MAC连上wifi或热点却不能上网问题 #新换的mac昨天还能连上wifi,今天就不好使了。 找到连接的wifi点击详细信息,选择TCP/IP 中的配置IPV4 选择关闭

Python Matplotlib 的学习笔记

Python Matplotlib 的学习笔记 0. Python Matplotlib 简介1. 为什么要用 Matplotlib?2. Matplotlib 基础类详解2-1. Line(线)2-2. Marker(标记)2-3. Text(文本)2-4. Legend(图例&…

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

2023-12 Scratch一级真题 分数:100 题数:37 测试时长:60min 一、单选题(共25题,共50分) 1.观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?(C)&#xf…