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 kids
    ki.read_book();//static, follow kids(left) baby is reading baby books


human 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的引用指向了子类kids
    public 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类的method

public 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()有关

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何部署一个高可用的 Linux 集群?

部署一个高可用的 Linux 集群需要经过多个步骤和考虑因素。以下是一个简要的指南,帮助您了解如何部署一个高可用的 Linux 集群: 确定需求和目标:在开始部署之前,您需要明确高可用性的定义和目标。对于一些组织而言,高…

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项,并创建相同的布局组件块在组件加载时, 将数组内容数据全部创建对应的组件内容, 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

2024春晚纸牌魔术原理----环形链表的约瑟夫问题

一.题目及剖析 https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a?tabnote 这道题涉及到数学原理,有一般公式,但我们先不用公式,看看如何用链表模拟出这一过程 二.思路引入 思路很简单,就试创建一个单向循环链表,然后模拟报数,删去对应的节点 三.代码引…

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02(20240212)1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02(20240212) 作者:胖头鱼的鱼…

LeetCode:69.x的平方根

嗨嗨嗨,二分又来了,淦它, 这个题官解是,C函数法,二分,和牛顿迭代法(暂且搁置), 当然还有暴力(不必讨论,就从0开始一个一个试)&#…

2.11日学习打卡----初学RocketMQ(二)

2.11日学习打卡 一. RocketMQ整合springboot 首先配置pom.xml文件 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>annotationProcessor</scope></dependency><dependency>…

服装效果图为何要用云渲染100?渲染100邀请码1a12

服装行业是充满创意和竞争的领域&#xff0c;而服装效果图是其中重要一环&#xff0c;以前效果图都是本地渲染&#xff0c;现在越来越多的设计师转向云渲染&#xff0c;以国内最专业的平台渲染100为例&#xff0c;云渲染有以下好处&#xff1a; 1、提高工作效率 设计师可以利用…

Netty源码系列 之 FastThreadLocal源码

目录 Netty优化方案之 FastThreadLocal 前言 ThreadLocal ThreadLocal是干什么的&#xff1f; 为什么要使用ThreadLocal工具类去操控存取目标数据到Thread线程 &#xff1f; ThreadLocal的使用场景 目标数据存储到Thread线程对象的哪里&#xff1f; 怎么样把一个目标数据…

JavaWeb:SpingBoot原理 --黑马笔记

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

Ubuntu Desktop - Terminal 输出全部选中 + 复制

Ubuntu Desktop - Terminal 输出全部选中 复制 1. Terminal2. Terminal 最大化3. Edit -> Select All4. Copy & PasteReferences 1. Terminal 2. Terminal 最大化 3. Edit -> Select All 4. Copy & Paste Edit -> Copy or Shift Ctrl C Edit -> Paste…

【Python网络编程之TCP三次握手】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之[TCP三次握手] 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2.…

Microsoft Excel 加载数据分析工具

Microsoft Excel 加载数据分析工具 1. 打开 Excel&#xff0c;文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel&#xff0c;数据 -> 数据分析References 1. 打开 Excel&#xff0c;文件 -> 选项 2. 加载项 -> 转到… ​​​ 3…

Win32 控制台绘图2

之前已经了解在控制台可以调用Win32 api绘图&#xff1b;下面继续加深一下此概念&#xff1b; #include <stdio.h> #include <stdlib.h> #include <windows.h>HWND WINAPI GetConsoleWindow();int main(int argc, char *argv[]) {HWND hwnd; HDC hdc; HPE…

【MySQL探索之旅】MySQL数据库下载及安装教程

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

c++ 内存

c 内存 内存分区 1.代码区&#xff1a;程序的机器指令&#xff0c;可以被机器直接执行。 属性&#xff1a;只读和共享 代码区包含什么&#xff1a; 在程序编译时就已经被分配好了地址&#xff0c;并保存在可执行文件的代码段中。当程序运行时&#xff0c;操作系统会将代码段的…

【C++】类的隐式类型转换

文章目录 前言一、隐式类型转换二、explicit关键字总结 前言 一、隐式类型转换 C 类的隐式类型转换是指当一个类定义了适当的构造函数或转换函数时&#xff0c;可以在需要时自动进行类型转换&#xff0c;而无需显式调用转换函数或构造函数。这使得代码更具灵活性和简洁性。下面…

一种简单的车辆过减速带识别方法

识别方法参考以下图片上的这篇论文第三章&#xff0c;有需要的自行知网下载。 一、离散冲击路面建立 我们之前已经搭建了C级路面&#xff0c;直接在C级路面中间某一段加上减速带就可以。这里我加的减速带&#xff0c;如下图所示&#xff0c;高30mm&#xff0c;凸台宽约20mm&am…

刘谦春晚魔术的数学原理

刘谦春晚魔术的数学原理 文章目录 前言魔术介绍魔术揭秘STEP 1STEP 2STEP 3STEP 4STEP 5STEP 6STEP 7 总结 前言 2024 春晚刘谦的第二个魔术很多人跟着一起做了&#xff0c;都觉得非常神奇。我也跟着操作了一遍&#xff0c;结果一眼就让我看出了背后的数学原理。下面给大家介…

自己搭建的幻兽帕鲁服务器怎么一键配置游戏参数?可视化面板调整参数

单击面板内的【调整参数】按钮&#xff0c;即可在下方表格中开启编辑模式。找到“死亡惩罚”配置项&#xff0c;并将它的值修改为&#xff1a;无丢失。 点击【保存】按钮&#xff0c;此时将弹出气泡&#xff0c;提示你当前操作需要在游戏服务重启后才可生效&#xff08;不会…

数据结构哈希表

这里个大家用数组来模拟哈希表 法一&#xff1a;拉链法 法二&#xff1a;开放寻址法 /** Project: 11_哈希表* File Created:Sunday, January 17th 2021, 2:11:23 pm* Author: Bug-Free* Problem:AcWing 840. 模拟散列表 拉链法*/ #include <cstring> #include <iostr…