Java学习笔记(14)--面向对象编程
面向对象基础
学习资料来自多态 - Java教程 - 廖雪峰的官方网站
目录
面向对象基础
Override
多态
举个例子
覆写Object方法
调用super
final
练习
小结
Override
在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)
举个例子,在Person类中定义run()方法,在子类Student类中,覆写这个方法
class Person {public void run() {System.out.println("Person.run");}
}
class Student extends Person {@Overridepublic void run() {System.out.println("Student.run");}
}
Override和Overload的区别:
如果方法签名不同,就是Overload,Overload方法是一个新方法;
如果签名方法相同,并且返回值也相同,就是Override
注意:
方法名相同,方法参数相同,但方法返回值不同,也是不同的方法,在Java程序中,出现这种情况,编译器会报错。
class Person {public void run() { ... }
}class Student extends Person {// 不是Override,因为参数不同public void run(String s) { ... }// 不是Override,因为返回值不同public int run() { ... }
}
加上Override可以让编译器帮助检查是否进行了正确的覆写,但他不是必须的。
引用变量的声明类型可能与其实际类型不符,比如:
Person p = new Student();
如果子类覆写了父类的方法,那么一个实际类型为Student,引用类型为Person的变量,调用其run()方法,调用的是Student的run()方法。
所以,Java实施例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。这个特性在面向对象编程中称之多态(Polymorphic)。
多态
多态是指针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
运行期才能动态决定调用的子类方法,对于某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。
举个例子
定义一种收入,需要报税,对于工资收入可以减去一个基数,如果享受国务院特殊津贴,可以全部免税。
public class Main {public static void main(String[] args) {Income[] incomes = new Income[] {new Income(3000),new Income(7500),new StateCouncilSpecialAllowance(15000)};System.out.println(totalTax(incomes));}public static double totalTax(Income... incomes) {double total = 0;for (Income income : incomes) {total += total + income.getTax();}return total;}
}
class Income {protected double income;public Income(double income) {this.income = income;}public double getTax() {return income * 0.1;}
}class Salary extends Income {public Salary(double income) {super(income);}@Overridepublic double getTax() {if(income <= 5000) {return 0;}return (income - 5000) * 0.2;}
}
class StateCouncilSpecialAllowance extends Income {public StateCouncilSpecialAllowance(double income) {super(income);}@Overridepublic double getTax() {return 0;}
}
利用多态,totalTax()只需要知道Income,不需要知道Salary和StateCouncilSpecialAllowance就能正确计算出总的税,
如果要新增一种收入,只需要从Income派生,然后正确覆写getTax()方法就行,把新的类型传入totalTax()不需要修改任何代码。
覆写Object方法
所有的class最终都继承自Object,而Object定义了几个重要方法:
- toString():把instance输出为String
- equals():判断两个instance是否逻辑相等
- hashCode():计算一个instance的哈希值
在必要情况下,可以覆写这几个方法,例如:
class Person {...// 显示更有意义的字符串:@Overridepublic String toString() {return "Person:name=" + name;}// 比较是否相等:@Overridepublic boolean equals(Object o) {// 当且仅当o为Person类型:if (o instanceof Person) {Person p = (Person) o;// 并且name字段相同时,返回true:return this.name.equals(p.name);}return false;}// 计算hash:@Overridepublic int hashCode() {return this.name.hashCode();}
}
调用super
在子类的覆写方法中,如果要调用父类的被覆写方法,可以通过super调用。
class Person {protected String name;public String hello() {return "Hello," + name;}
}class Student extends Person {@Overridepublic String hello() {return super.hello() + "!";}
}
final
- 用final修饰的方法不能被Override:父类的方法用final修饰就可以不允许子类他的某个方法进行覆写
- 用final修饰的类不能被继承。
- 用final修饰的字段在初始化之后不能被修改。
练习
public class Main {public static void main(String[] args) {// TODO: 给一个有工资收入和稿费收入的小伙伴算税:Income[] incomes = new Income[]{new Income(3000),new SalaryIncome(7500),new RoyaltyIncome(12000)};System.out.println(totalTax(incomes));}public static double totalTax(Income... incomes) {double total = 0;for (Income income : incomes) {total += total + income.getTax();}return total;}
}class Income {protected double income;public Income(double income) {this.income = income;}public double getTax() {return income * 0.1; // 税率10%}
}class SalaryIncome extends Income {public SalaryIncome(double income) {super(income);}@Overridepublic double getTax() {if (income <= 5000) {return 0;}return (income - 5000) * 0.2;}
}class RoyaltyIncome extends Income {public RoyaltyIncome(double income) {super(income);}
}
小结
子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;
Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;
相关文章:
Java学习笔记(14)--面向对象编程
面向对象基础 学习资料来自多态 - Java教程 - 廖雪峰的官方网站 目录 面向对象基础 Override 多态 举个例子 覆写Object方法 调用super final 练习 小结 Override 在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写&…...
《Swift 字面量》
《Swift 字面量》 介绍 在 Swift 编程语言中,字面量是一种表示源代码中固定值的表达方式。字面量可以直接表示数字、字符串、布尔值等基本数据类型,为编程提供了简洁和直观的方式。Swift 支持多种类型的字面量,包括整数字面量、浮点数字面量…...
数据库 SQL 常用语句全解析
数据库 SQL 常用语句全解析 在数据库领域,SQL(Structured Query Language)作为标准语言,掌控着数据的查询、插入、更新与删除等关键操作。无论是新手入门数据库,还是经验丰富的开发者日常工作,熟练掌握 SQ…...
SQLite 命令
关于《SQLite 命令》的文章,我可以为您概述一些关键点。SQLite是一个轻量级的数据库管理系统,它被广泛用于各种应用程序中。SQLite命令主要分为两类:一类是SQL命令,另一类是SQLite特定的点命令。 SQL命令:这些命令用于…...
本地如何启动casdoor
1、下载代码 GitHub - casdoor/casdoor at v1.777.0 下载对应tag的代码,我这里选择的时v1.777.0版本 通过网盘分享的文件:casdoor-1.777.0.zip 链接: https://pan.baidu.com/s/1fPNqyJYeyfZnem_LtEc0hw 提取码: avpd 2、启动后端 1、使用goland编译…...
目标检测-R-CNN
R-CNN在2014年被提出,算法流程可以概括如下: 候选区域生成:利用选择性搜索(selective search)方法找出图片中可能存在目标的候选区域(region proposal) CNN网络提取特征:对候选区域进行特征提取(可以使用AlexNet、VGG等网络) 目…...
【持续更新】Github实用命令
Intro 最近高强度使用github,遂小计于此作为备忘。 Basic github是一个代码管理软件,能够track文件变动并且管理版本,是当代coding必不可少的工具。当你安装好github在本地以后,你可以通过以下命令初始化当前文件夹(…...
docker 容器的基本使用
docker 容器 一、docker是什么? 软件的打包技术,就是将算乱的多个文件打包为一个整体,打包技术在没有docker容器之前,一直是有这种需求的,比如上节课我把我安装的虚拟机给你们打包了,前面的这种打包方式是…...
css让按钮放在最右侧
要将 el-button 按钮放在最右侧,可以使用多种方法,具体取决于使用的布局方式和样式库。以下是几种常见的解决方案: 方法 1:使用 CSS Flexbox Flexbox 是一种非常灵活的布局方式,可以轻松实现水平或垂直对齐。你可以将…...
8K+Red+Raw+ProRes422分享5个影视级视频素材网站
Hello,大家好,我是后期圈! 在视频创作中,电影级的视频素材能够为作品增添专业质感,让画面更具冲击力。无论是广告、电影短片,还是品牌宣传,高质量的视频素材都是不可或缺的资源。然而ÿ…...
Linux网络——UDP的运用
Linux网络——UDP的运用 文章目录 Linux网络——UDP的运用一、引入二、服务端实现2.1 创建socket套接字2.2 指定网络接口并bind2.3 接收数据并处理2.4 整体代码2.5 IP的绑定的细节 三、用户端实现3.1 创建套接字3.2 指定网络接口3.3 发生数据并接收3.4 绑定问题 四、代码五、UD…...
项目亮点案例
其实对我来说是日常操作,但是如果在面试的时候面试者能把日常的事情总结好发出来,其实足矣。 想让别人认同项目,选取的示例需要包含以下要素: 亮点项目四要素:明确的目标,问题点,解决方法和结果…...
Retrofit源码分析:动态代理获取Api接口实例,解析注解生成request,线程切换
目录 一,Retrofit的基本使用 1.定义api接口 2.创建Retrofit实例 3.获取api接口实例发起请求 二,静态代理和动态代理 1,静态代理 2,动态代理 三,动态代理获取Api接口实例 四,解析接口方法注解&…...
范德蒙矩阵(Vandermonde 矩阵)简介:意义、用途及编程应用
参考: Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares Stephen Boyd and Lieven Vandenberghe 书的网站: https://web.stanford.edu/~boyd/vmls/ Vandermonde 矩阵简介:意义、用途及编程应用 在数学和计算科学中&a…...
【中标麒麟服务器操作系统实例分享】java应用DNS解析异常分析及处理
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://document.kylinos.cn 情况描述 中标麒麟服务器操作系统V7运行在 ARM…...
网安瞭望台第17期:Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析
国内外要闻 Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析 在网络安全的复杂战场中,近期出现了一个值得关注的动态:名为 Rockstar 2FA 的钓鱼即服务(PhaaS)工具包遭遇变故,意外推动了另一个新生服务 Flo…...
玩转OCR | 探索腾讯云智能结构化识别新境界
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 玩转OCR 腾讯云智能结构化识别产品介绍服务应用产品特征行业案例总结 腾讯云智能结构化识别 腾讯云智能结构化OCR产品分为基础版与高级版&am…...
idea2024创建JavaWeb项目以及配置Tomcat详解
今天呢,博主的学习进度也是步入了JavaWeb,目前正在逐步杨帆旗航,迎接全新的狂潮海浪。 那么接下来就给大家出一期有关JavaWeb的配置教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正…...
外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列
在《SQL 改写系列:外连接转内连接的常见场景与错误》一文中,我们了解到谓词条件可以过滤掉连接结果中的 null 情形的,将外连接转化为内连接的做法是可行的,正如图1中路径(a)所示。此时,敏锐的你或许会进一步思考&#…...
华为实训课笔记 2024 1223-1224
华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…...
Ostrakon-VL在Qt桌面应用中的集成:开发跨平台视觉工具
Ostrakon-VL在Qt桌面应用中的集成:开发跨平台视觉工具 1. 为什么选择QtOstrakon-VL组合 在开发跨平台视觉分析工具时,Qt框架和Ostrakon-VL模型的组合提供了独特优势。Qt作为成熟的跨平台GUI框架,可以轻松构建Windows、Linux和macOS上的原生…...
腾讯云轻量2核2G Ubuntu 服务器配置 + Xshell 连接服务器
购买成功会跳转到这个页面一、第一步:放行防火墙端口(必做!否则连不上、访问不了) 我们现在在服务器列表页,必须先开放端口,否则 Xshell 连不上、项目也访问不了。 1. 进入防火墙设置 点击截图箭头指向的 「…...
DataGrip高效操作指南(动图演示版)
1. DataGrip入门:从安装到第一个连接 第一次打开DataGrip时可能会被满屏的英文界面吓到,但别担心,这玩意儿用起来比看起来简单多了。我当年从Navicat转过来的时候也适应了两天,现在回头看看简直像从自行车换到了跑车。安装包直接去…...
C#利用HSLCommunication库实现PLC数据采集与监控系统实战
1. 工业场景下的PLC数据采集需求 在现代化工厂的生产线上,PLC(可编程逻辑控制器)就像车间里的"大脑",24小时不间断地控制着各种设备的运转。想象一下,你管理的是一条汽车装配线,几十台机器人正在…...
Asian Beauty Z-Image Turbo开箱即用:浏览器访问即启东方人像生成服务
Asian Beauty Z-Image Turbo开箱即用:浏览器访问即启东方人像生成服务 1. 项目简介 Asian Beauty Z-Image Turbo是一款专注于东方美学人像生成的本地化工具,基于通义千问Tongyi-MAI Z-Image底座模型,结合专门训练的Asian-beauty权重开发而成…...
告别手动同步!用Karmada实现跨集群应用一键分发(附PropagationPolicy配置详解)
告别手动同步!用Karmada实现跨集群应用一键分发(附PropagationPolicy配置详解) 在云原生技术快速发展的今天,企业往往需要管理分布在多个地域、不同环境的Kubernetes集群。传统的手工同步方式不仅效率低下,还容易出错。…...
Linux内核中的虚拟文件系统详解
Linux内核中的虚拟文件系统详解 引言 虚拟文件系统(VFS)是Linux内核中一个至关重要的抽象层,它为用户空间程序提供了统一的文件系统接口,隐藏了不同文件系统的实现细节。通过VFS,Linux能够同时支持ext4、XFS、Btrfs等…...
Nuxt v4.x 应用创建中的常见问题与解决方案
Nuxt v4.x 应用创建中的常见问题与解决方案 在构建现代Web应用时,Nuxt.js以其出色的开发体验和强大的功能集赢得了众多开发者的青睐。随着v4.x版本的发布,这个基于Vue.js的框架带来了更多令人兴奋的特性,但同时也伴随着一些新的挑战。本文将深…...
基于角谱传播的MATLAB仿真:从“相机人”到衍射光场的可视化探索
1. 从"相机人"到衍射光场:角谱传播的奇妙之旅 第一次看到"相机人"和Lena相位合成的复振幅场在MATLAB中传播时,那种震撼感至今难忘。就像看着一幅抽象画逐渐显露出隐藏的图案,光强分布中慢慢浮现出原本看不见的相位信息。…...
D3KeyHelper终极指南:暗黑3技能自动化与辅助功能完全解析
D3KeyHelper终极指南:暗黑3技能自动化与辅助功能完全解析 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破…...
