7.11 Java方法重写

7.11 Java方法重写

这里首先要确定的是重写跟属性没有关系,重写都是方法的重写,与属性无关

  1. 带有关键字Static修饰的方法的重写实例

    父类实例

    package com.baidu.www.oop.demo05;
    
    public class B {
        public static void test(){
            System.out.println("这是父类方法的重写");
        }
    }
    

    子类实例

    package com.baidu.www.oop.demo05;
    
    public class A extends B{
        public static void test(){
            System.out.println("这是子类方法的重写");
        }
    }
    

    主程序实例

    package com.baidu.www.oop;
    
    import com.baidu.www.oop.demo05.A;
    import com.baidu.www.oop.demo05.B;
    
    public class Application {
        public static void main(String[] args) {
            A a = new A();
            a.test();
            //父类的引用指向了子类
            B b = new A();
            b.test();
            /*
            * 这里new的都是A但是输出结果不同
            * a.test()调用的是A类中的静态方法
            * b.test()调用的是B类中的静态方法
            * A类与B类之间又有继承关系
            * 有了继承关系在new A()的时候,子类是可以指向父类的
            * 也就是B b = new A()中父类的引用b可以指向子类
            * 因为类型之间可以转化
            * 在这个实例中我们也能看出,方法的调用只跟等号左边的类有关
            * 也就是定义的数据类型有关
            * 也就是与右边的new A()没有什么关系*/
        }
    }
    /*
    * 这是子类方法的重写
    这是父类方法的重写
    
    Process finished with exit code 0*/
    
  2. 不带Static关键字的方法的重写

    在IDEA中可以使用alt+insert快捷键实现快速插入方法的重写如图

    快捷键

    选择相应的父类方法可以重写,同时在方法上会自动生成一个注解

    @Override//注解跟注释一样,只不过这是一个又功能的注释
        public void test1() {
            super.test1();//默认调用父类的方法
        }
    }
    

    Override就是重写的意思,生成的重写的方法默认的是调用父类的方法。

    不带Static关键字修饰的父类实例

    package com.baidu.www.oop.demo05;
    
    public class B {
        public static void test(){
            System.out.println("这是父类static修饰的方法的重写");
        }
        public void test1(){
            System.out.println("这是父类没有static修饰的方法的重写");
        }
    
    }
    

    不带Static关键字修饰的子类实例

    package com.baidu.www.oop.demo05;
    
    public class A extends B{
        public static void test(){
            System.out.println("这是子类static修饰的方法的重写");
        }
    
        @Override
        public void test1() {
            System.out.println("这是子类没有static修饰的方法的重写");
        }
    }
    

    不带Static关键字修饰的主程序实例

    package com.baidu.www.oop;
    
    import com.baidu.www.oop.demo05.A;
    import com.baidu.www.oop.demo05.B;
    
    public class Application {
        public static void main(String[] args) {
            A a = new A();
            a.test();
            a.test1();
            //父类的引用指向了子类
            B b = new A();
            b.test();
            b.test1();
            /*
            * 这里new的都是A但是输出结果不同
            * a.test()调用的是A类中的静态方法
            * b.test()调用的是B类中的静态方法
            * A类与B类之间又有继承关系
            * 有了继承关系在new A()的时候,子类是可以指向父类的
            * 也就是B b = new A()中父类的引用b可以指向子类
            * 因为类型之间可以转化
            * 在这个实例中我们也能看出,关键字static修饰的静态方法的调用只跟等号左边的类有关
            * 也就是定义的数据类型有关,就像double i = 1;虽然赋值了整型,但是数值类型还是double
            * 也就是与右边的new A()没有什么关系*/
        }
    }
    /*
    这是子类static修饰的方法的重写
    这是子类没有static修饰的方法的重写
    这是父类static修饰的方法的重写
    这是子类没有static修饰的方法的重写
    
    
    Process finished with exit code 0*/
    

    从运行结果可以看出没有Static关键字修饰的方法的重写,虽然B b= new A();但是用Static关键字修饰的test()方法重写的调用是调用的父类的方法,而没有Static关键字修饰的test1()方法则是调用了子类的方法的重写。这里我们就得出一个结论静态方法与非静态方法是有区别的,没事的时候不要写一些静态的方法去玩,如果是使用了Static修饰的静态方法是与左边的定义类型有关的,而么有Static修饰的非静态方法则是与右侧赋值的方法有关,这也就是子类重写了父类的方法

    这里一定要注意重写只与非静态的方法有关,与静态方法没有关系,因为静态方法在类加载的时候就已经进入内存。而且重写方法的关键词也必须是public修饰的。

    这里我们也看出方法的重写与父类的方法名一模一样,只是实现的代码不同,与重载不同的是

    1. 重载是在同一个类中的,而重写则是在父类与子类之间的
    2. 重载是同一个类中的同一方法名但参数不同,而重写则是在不同类中的同一方法,只不过实现代码也就是方法体不同
    重写:前提:必须要有继承关系,而且是子类重写父类的方法!
    1.方法名必须相同
    2.参数列表必须相同
    3.修饰符:范围可以扩大,但是不能缩小,比如父类如果是一个Private私有类型的,假设可以被继承,那么子类可以写成public的,但是如果父类是public的子类重写时不能变成Private的类型。这里修饰符的优先级public > protected > default > private,也就是范围可以扩大但是不能缩小。
    4.抛出的异常:重写可能会抛出异常,异常的范围可以被缩小,但不能扩大,这与方法重写修饰符刚好相反,也就是子类本身是继承父类的方法,如果抛出异常,只在子类中抛出异常就行,不能再连累父类。
    
  3. 为什么需要重写

    1. 生活中我们经常遇到父类的功能子类不一定需要或者不一定满足,父类中方法实现功能太多了,子类只需要少部分即可满足,或者父类太简单了,不能满足子类的,所以就需要子类重写父类的方法。

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

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

相关文章

C++--红黑树

1.什么是红黑树 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因…

【Java转Go】快速上手学习笔记(二)之基础篇一

目录 创建项目数据类型变量常量类型转换计数器键盘交互流程控制代码运算符 创建项目 上篇我们安装好了Go环境,和用IDEA安装Go插件来开发Go项目:【Java转Go】快速上手学习笔记(一)之环境安装篇 。 这篇我们开始正式学习Go语言。我…

【新知测评实验室】解谜扫描全能王——“智能高清滤镜”黑科技

目录 一、“智能高清滤镜” 原理分析1.1、智能扫描引擎AI-Scan功能拆解1.1.1、**图像感知**1.1.2、场景化决策 1.2、版面还原与识别技术分析1.2.1、元素检测和识别1.2.2、元素聚合1.2.3、版面识别 二、深度测评——“智能高清滤镜”功能2.1、图像处理方面2.2、摩尔纹去除方面2.…

【C++类和对象】类有哪些默认成员函数呢?(下)

文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数四. 取地址及const取地址操作符重载扩展内容 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡…

ffmepg滤镜

代码实现: 1.get_format() 这个是QSV硬件解码时的回调函数,在这里初始化hw_frames_ctx, get_format会在解码时被调用。因此对滤镜的初始化init_filter()应在得到第一帧数据后调用。 2.hw_frames_ctx,需要按照要求把他们传给对应的filter 3.然…

向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案

三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…

OPPO A57刷机资源(附简略教程)

https://www.123pan.com/s/hcAqVv-fpHWd.html提取码:buAp 图中画框的为必须下载的(xiaomiflash和twrp必须解压后使用) ​ 打开xiaomiflash点击driver点击install(就是框住的按钮)等待安装完成 ​用数据线将oppo a57与电脑连接&a…

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是,尽管"逻辑回归"名字带有“回归”二字,但逻辑回归是一个分类算法,而不是回归算法。 我认为&#xff…

用easyui DataGrid编辑树形资料

easyui显示编辑树形资料有TreeGrid元件,但是这个元件的vue版本和react版本没有分页功能。virtual scroll功能也表现不佳。 我用DataGrid来处理。要解决的问题点: (1)如何显示成树形。即,子节点如何有缩进。 先计算好…

一、进入sql环境,以及sql的查询、新建、删除、使用

1、进入sql环境 》》》mysql -u root -p 》》》输入密码 2、sql语言的分类 3、注意事项: 4、基础操作: (1)查询所有数据库: show databases; 运行结果: (2)创建一个新的数据库&…

网络通信原理传输层TCP三次建立连接(第四十八课)

ACK :确认号 。 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。确认号X+1SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的…

MongoDB 简介

什么是MongoDB ? MongoDB 是由C语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

从SaaS到RPA,没有真正“完美”的解决方案!

众所周知,SaaS行业越来越卷,利润也越来越“薄”,这是传统软件厂商的悲哀,也是未来数字化行业不得不面对的冷峻现状之一。 随着基于aPaaS、低代码的解决方案之流行,SaaS行业变得越来越没有技术门槛,IT人员的…

win10安装mysql和c++读取调用举例

一、下载mysql8.rar解压到C盘(也可以解压到其他位置) 在系统环境变量添加JAVA_HOMEC:\myslq8,并在path中添加%JAVA_HOME%\bin; 二、以管理员身份进入命令窗口 三、修改配置文件指定安装路径和数据库的存放路径 四、键入如下命令初始化并启动mysql服务,然后修改登录…

使用qsqlmysql操作mysql提示Driver not loaded

环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常,但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…

Android中如何不编译源生模块

如果想让自己的app 替换系统的app 比如使用闪电浏览器替换系统的Browser 首先把闪电浏览器放到 vendor/rockchip/common/apps Android.mk LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE : Lightning LOCAL_SRC_FILES : $(LOCAL_MODULE).apk LOCAL_MODULE_C…

Eclipse使用插件时提示Plugin Error loading shared libraries

项目场景: 使用Eclipse的过程中,依赖openCONFIGURATOR插件进行新建项目时,弹出如下的错误: Plugin Error loading shared libraries 以及具体的信息为: Can’t find dependent libraries 这里我使用的插件为openCONFIGURATOR插件 问题描述 如上场景,提示缺少动态链接库…

实战篇之基于二进制思想的用户标签系统(Mysql+SpringBoot)

一: 计算机中的二进制 计算机以二进制表示数据,以表示电路中的正反。在二进制下,一个位只有 0 和 1 。逢二进一 位。类似十进制下,一个位只有 0~9 。逢十进一位。 二: 进制常用运算 (位运算)…

Django框架 靓号管理(增删改查)

Django框架 靓号管理(增删改查) 新建一个项目 backend 使用pycharm创建app startapp app项目目录 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…

【设计模式】抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象…
最新文章