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

news2025/1/21 21:50:59

重点: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()有关

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

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

相关文章

extern 使用头文件

画红线的那个 很重要 详细解释之后写 全局变量定义在头文件,然后如果很多c文件通过include包含这个头文件,那么因为include是在预编译阶段,直接把这个头文件里面的东西解出来,然后插入在这个c文件,那么如果有很多个c文…

mysql数据库concat指定连接符号

SELECT CONCAT_WS(;;;, 你好,华为) FROM DUAL;

【算法随想录01】环形链表

题目:141. 环形链表 难度:EASY 代码 哈希表遍历求解,表中存储的是元素地址。 时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( N ) O(N) O(N) /*** Definition for singly-linked list.* struct ListNode {* int val;* …

iTop-4412 裸机程序(十九)- 按键中断

目录 0.源码1.异常向量表1.1 原理1.2 异常种类1.3 ARMv7 规定的异常向量表 2. 中断2.1 iTop-4412 中使用的中断相关寄存器 上篇博文介绍了按键的轮询处理方式,本篇介绍按键的中断方式。 0.源码 GitHub:https://github.com/Kilento/4412NoOS 1.异常向量…

《Java 简易速速上手小册》第4章:Java 中的异常处理(2024 最新版)

文章目录 4.1 异常类型和错误 - 遇见你的小怪兽4.1.1 基础知识4.1.2 重点案例:文件读取处理4.1.3 拓展案例 1:处理空指针异常4.1.4 拓展案例 2:捕获多个异常 4.2 异常处理机制 - 穿上你的超级英雄斗篷4.2.1 基础知识4.2.2 重点案例&#xff1…

SpringCloud-Feign:负载均衡(基于服务端)

7.Feign:负载均衡(基于服务端) 7.1 Feign简介 Feign是一个开源的声明式HTTP客户端,它可以简化HTTP API的调用过程。Feign的设计目标是使得使用者可以像调用本地方法一样调用远程服务,使得编写和维护HTTP客户端变得更加简单。类似controller…

2016-2022年哨兵影像的在线底图

有一个欧洲初创公司对哨兵影像进行了去云处理,制作了一个2016年-2022年的全球哨兵底图。目前底图通过wmts发布,可免费使用,无需搭梯子。 该数据的特点是: 很少的云覆盖,较少的条纹,色彩平衡 底图切片的网…

推荐高端资源素材图库下载平台整站源码

推荐高端图库素材下载站的响应式模板和完整的整站源码,适用于娱乐网资源网。该模板支持移动端,并集成了支付宝接口。 演示地 址 : runruncode.com/tupiao/19692.html 页面设计精美,不亚于大型网站的美工水准,并且用户…

如何对研究成果进行有效的专利布局

一、背景 研究成果通常是研究者、学者或创新者智力劳动的产物,如专利技术、设计、算法、新药物、研究方法等。通过专利申请、版权法、商标法、商业秘密等方式对其进行法律保护,确保研究者拥有对其成果的专有权,可以独享经济利益和控制权。 …

[LeetCode周赛复盘] 第 384 场周赛20240211

[LeetCode周赛复盘] 第 384 场周赛20240211 一、本周周赛总结100230. 修改矩阵1. 题目描述2. 思路分析3. 代码实现 100219. 回文字符串的最大数量1. 题目描述2. 思路分析3. 代码实现 100198. 匹配模式数组的子数组数目 II1. 题目描述2. 思路分析3. 代码实现 参考链接 一、本周…

GPT4:你是故意的吧!

请问下面选项中哪个是中文? A.Chinese B.英文 这是一个关于语言识别的问题。我们需要分析并确定所给选项中哪个表示中文。 对于选项A.Chinese:这个词本身表示“中文”或“中国的”。在多种语境中,它经常被用来指代中国的语言,即中…

京东组件移动端库的使用 Nut-UI

1.介绍 NutUI NutUI-Vue 组件库,基于 Taro,使用 Vue 技术栈开发小程序应用,开箱即用,帮助研发快速开发用户界面,提升开发效率,改善开发体验。 特性 🚀 80 高质量组件,覆盖移动端主…

Spring Boot 笔记 007 创建接口_登录

1.1 登录接口需求 1.2 JWT令牌 1.2.1 JWT原理 1.2.2 引入JWT坐标 1.2.3 单元测试 1.2.3.1 引入springboot单元测试坐标 1.2.3.2 在单元测试文件夹中创建测试类 1.2.3.3 运行测试类中的生成和解析方法 package com.geji;import com.auth0.jwt.JWT; import com.auth0.jwt.JWTV…

Spring Boot 笔记 010 创建接口_更新用户头像

1.1.1 usercontroller中添加updateAvatar,校验是否为url PatchMapping("updateAvatar")public Result updateAvatar(RequestParam URL String avatarUrl) {userService.updateAvatar(avatarUrl);return Result.success();} 1.1.2 userservice //更新头像…

BYTEVALUE 百为流控路由器远程命令执行漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

洛谷: P9749 [CSP-J 2023] 公路

思路: 贪心思想指的是在对问题求解的时候,总是能做出在当前看来是最好的选择,也就是说,如果要得到整个问题的最优答案,那么要求每一步都能做出最好的选择(feihua)。 在这道题里面,我们希望在来到第i站的时…

【十七】【C++】stack的简单实现、queue的常见用法以及用queue实现stack

stack的简单实现 #include <deque> #include <iostream> using namespace std; namespace Mystack {template<class T, class Container std::deque<T>>class stack {public:stack(): _c(){}void push(const T& data) {_c.push_back(data);}void …

论文阅读-One for All : 动态多租户边缘云平台的统一工作负载预测

论文名称&#xff1a;One for All: Unified Workload Prediction for Dynamic Multi-tenant Edge Cloud Platforms 摘要 多租户边缘云平台中的工作负载预测对于高效的应用部署和资源供给至关重要。然而&#xff0c;在多租户边缘云平台中&#xff0c;异构的应用模式、可变的基…

动态内存管理、柔性数组

动态内存分配的由来 我们已经掌握的内存开辟的方式&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 上面开辟的空间大小是固定不可变的数组申请的大小也是确定了之后就不能改变 这里就引入了动态内存的开辟&#x…

FT2232调试记录(1)

FT2232调试记录 &#xff08;1&#xff09;获取当前连接的FTDI设备通道个数:&#xff08;2&#xff09;获取当前连接的设备通道的信息:&#xff08;3&#xff09;配置SPI的通道:&#xff08;4&#xff09;如何设置GPIO:&#xff08;5&#xff09;DEMO测试&#xff1a; #参考文档…