Java学习笔记(14)--面向对象编程

news2024/12/24 7:35:15

面向对象基础

学习资料来自多态 - Java教程 - 廖雪峰的官方网站

目录

面向对象基础

Override

多态

举个例子

覆写Object方法

调用super

final

练习

小结


Override

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)

举个例子,在Person类中定义run()方法,在子类Student类中,覆写这个方法

class Person {
    public void run() {
        System.out.println("Person.run");
    }
}
class Student extends Person {
    @Override
    public 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);
    }

    @Override
    public double getTax() {
        if(income <= 5000) {
            return 0;
        }
        return (income - 5000) * 0.2;
    }
}
class StateCouncilSpecialAllowance extends Income {
    public StateCouncilSpecialAllowance(double income) {
        super(income);
    }
    @Override
    public double getTax() {
        return 0;
    }
}

利用多态,totalTax()只需要知道Income,不需要知道Salary和StateCouncilSpecialAllowance就能正确计算出总的税,

如果要新增一种收入,只需要从Income派生,然后正确覆写getTax()方法就行,把新的类型传入totalTax()不需要修改任何代码。

覆写Object方法

所有的class最终都继承自Object,而Object定义了几个重要方法:

  • toString():把instance输出为String
  • equals():判断两个instance是否逻辑相等
  • hashCode():计算一个instance的哈希值

在必要情况下,可以覆写这几个方法,例如:

class Person {
    ...
    // 显示更有意义的字符串:
    @Override
    public String toString() {
        return "Person:name=" + name;
    }

    // 比较是否相等:
    @Override
    public 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:
    @Override
    public int hashCode() {
        return this.name.hashCode();
    }
}

调用super

在子类的覆写方法中,如果要调用父类的被覆写方法,可以通过super调用。

class Person {
    protected String name;
    public String hello() {
        return "Hello," + name;
    }
}

class Student extends Person {
    @Override
    public 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);
    }

    @Override
    public double getTax() {
        if (income <= 5000) {
            return 0;
        }
    return (income - 5000) * 0.2;
    }
}

class RoyaltyIncome extends Income {
    public RoyaltyIncome(double income) {
        super(income);
    }
}

小结

子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;

Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;

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

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

相关文章

ESP32S3 使用LVGL驱动LCD屏(ST7789主控)

ESP32S3 使用LVGL驱动LCD屏&#xff08;ST7789主控&#xff09; 目录 1 分析原理图 2 驱动、点亮LCD(ST7789) 2.1 在工程中添加目录、文件 2.2 添加esp_lvgl_port组件 2.3 对工程进行必要的配置 2.4 编写必要代码 3 烧录、验证 1 分析原理图 要使用SOC驱动LCD屏&#…

【hackmyvm】Zday靶机wp

HMVrbash绕过no_root_squash静态编译fogproject 1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描 3. fog project Rce3.1. ssh绕过限制 4. NFS no_root_squash5. bash运行不了怎么办 靶机链接 https://hackmyvm.eu/machines/machine.ph…

neo4j console 报错

项目场景&#xff1a; neo4j 开启失败 问题描述 在终端打开 neo4j 失败打开cmd, 输入: neo4j console 报错 原因分析&#xff1a; 1 可能是没有配置环境变量2 当前脚本的执行策略有问题 解决方案&#xff1a; 解决没有配置环境变量 添加环境变量 在path路径中将变量添加进去…

范德蒙矩阵(Vandermonde 矩阵)简介:意义、用途及编程应用

参考&#xff1a; Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares Stephen Boyd and Lieven Vandenberghe 书的网站: https://web.stanford.edu/~boyd/vmls/ Vandermonde 矩阵简介&#xff1a;意义、用途及编程应用 在数学和计算科学中&a…

编译原理复习---正则表达式+有穷自动机

适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或regexp&#xff09;是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成&#xff0c;这些字符和符号定义了一种搜索模式…

CAD跨图纸复制与粘贴怎么操作?教程来了

在过去&#xff0c;图纸的复制粘贴工作大多依赖于电脑完成&#xff0c;手机则因运行内存等硬件限制&#xff0c;难以像电脑那样轻松实现多图同开&#xff0c;以及图纸内容的跨图复制粘贴。为解决这一痛点&#xff0c;CAD看图王手机端推出了跨图复制与粘贴功能&#xff0c;为用户…

算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II

93. 复原 IP 地址--分割 题目 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…

Go怎么做性能优化工具篇之基准测试

一、什么是基准测试&#xff08;Benchmark&#xff09; 在 Go 中&#xff0c;基准测试是通过创建以 Benchmark 开头的函数&#xff0c;并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口&#xff0c;比如设置测试执行的次数、记录每次执行的…

【贪吃蛇小游戏 - JavaIDEA】基于Java实现的贪吃蛇小游戏导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定 选择“从现有项目创建项目”。点击“下一步” 点击下一步&a…

LabVIEW手机屏幕耐冲击测试

开发了一个基于LabVIEW的智能手机屏幕耐冲击测试系统。系统利用LabVIEW软件与高精度传感器&#xff0c;对手机屏幕进行落球冲击试验&#xff0c;以测定其耐冲击性能。这项技术不仅提高了测试的精度和效率&#xff0c;而且对智能手机屏幕的质量控制和改进提供了科学依据。 项目背…

Python + 深度学习从 0 到 1(01 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 深度学习之前&#xff1a;机器学习简史 什么要了解…

FPGA学习(基于小梅哥Xilinx FPGA)学习笔记

相关资源网站&#xff08;小梅哥FPGA&#xff09; https://www.corecourse.cn/forum.php?modviewthread&tid27978 https://www.corecourse.cn/forum.php?modviewthread&tid28730 本篇文章使用的开发板为&#xff1a; 小梅哥 Xilinx FPGA 型号&#xff1a;XC7A35T 芯…

网安瞭望台第17期:Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析

国内外要闻 Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析 在网络安全的复杂战场中&#xff0c;近期出现了一个值得关注的动态&#xff1a;名为 Rockstar 2FA 的钓鱼即服务&#xff08;PhaaS&#xff09;工具包遭遇变故&#xff0c;意外推动了另一个新生服务 Flo…

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发 学习内容&#xff1a; 使用本地EC2中部署docker应用使用ECS的EC2模式进行容器开发使用ECS的Fargate模式进行容器开发 1. 使用本地EC2中部署docker应用 docker整体 这里展示了docker的整体流程。 开发阶段 编写dockerfile…

【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换

文章日期&#xff1a;2024.12.23 使用工具&#xff1a;Python 本章知识&#xff1a;制作一款图片下载器_DOS窗口&#xff08;爬虫专用&#xff09; 文章难度&#xff1a;低等&#xff08;没难度&#xff09; 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要…

关于博客系统的自动化功能测试报告

1.项目背景 基于 SSM 的个人博客系统测试 博客系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;前端主要有四个页面构成:登录页、列表页、详情页以及编辑页&#xff0c;模拟实现了个人博客列表页面&#xff0c;其结合后端实现了以下的…

计算机的错误计算(一百八十九)

摘要 用大模型计算 tan(12.345) . 自变量取弧度。结果保留10位有效数字。不同于前面两节的大模型&#xff0c;本节调用了新的两个大模型。然而&#xff0c;很遗憾&#xff0c;它们给出的答案似乎仍然是“匹配”出来的&#xff0c;不是计算出来的。当然&#xff0c;均是错误的。…

IP地址数据信息和爬虫拦截的关联

IP地址数据信息和爬虫拦截的关联主要涉及到两方面的内容&#xff0c;也就是数据信息和爬虫。IP 地址数据信息的内容丰富&#xff0c;包括所属地域、所属网络运营商、访问时间序列、访问频率等。 从IP地址信息中可以窥见多样的数据&#xff0c;那么我们应该怎么利用IP地址信息来…

springboot+logback学习文档

目录 1、前提说明2、引入依赖、将logback配置文件打到classes下2.1、引入依赖2.2、将logback配置文件打到classes下 3、使用说明3.1、配置文件名称和位置3.2、常规用法3.2.1、property标签&#xff08;普通变量&#xff09;3.2.2、springProperty标签&#xff08;spring变量&am…

Laya ios接入goole广告,开始接入 2

开始使用 | iOS | Google for Developers 谷歌广告的官网&#xff0c;需要搭梯子&#xff0c;API你说详细吧&#xff0c;也就那样&#xff0c;主要是没接过 一步步来吧 0.laya导包 前端出包原生 screenorientation 全部 portrait&#xff0c;我这个是竖屏的 注意这个&a…