Java中的继承和多态

继承

在现实世界中,狗和猫都是动物,这是因为他们都有动物的一些共有的特征。

在Java中,可以通过继承的方式来让对象拥有相同的属性,并且可以简化很多代码

例如:动物都有的特征,有名字,有年龄,那么让猫和狗都继承于动物,这样猫和狗就也有了名字和年龄。

需要使用的关键字:extends

class Animals{int age;String name;
}class Dogs extends Animals{String height;
}class Cats extends Animals{String weight;
}

通过继承的方式就能让dog和cat继承animals的age和name属性。并且不止属性,父类中的方法也是可以继承的。

但是要是父类和子类中的属性名或者方法名因为某些原因重名了呢?

父类成员变量、成员方法访问

如果属性名相同,那么则会优先访问自己的,而不是父类的:

public class Base {int a;int b;int c;}public class Derived extends Base{int a;             char b;             public void method(){a = 100;       b = 101;        c = 102;        }}

成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

例如上面的会优先访问class Derived中有的,如果没有再访问到Base中的。

方法同理,也是优先访问子类的再访问父类的;但是方法有个特殊的点:

如果子类父类方法是重名的但是形成重载了,也就是参数列表不同,那么会优先匹配重载的那个方法。

super关键字

如果父类和子类是重名的,但是想要访问父类的方法,这个时候就可以使用super关键字,使得拿到的对象/方法直接就是父类的。

class Animal {void eat() {System.out.println("这里是父类");}
}class dog extends Animal {void eat() {super.eat();System.out.println("这里是子类");}
}

这样就会先拿到父类中的eat方法,然后再打印子类中的相关语句。

super同样可以适用成员变量:

class Animal {String name = "Animal";
}class Dog extends Animal {String name = "Dog";void printName() {System.out.println(super.name);System.out.println(this.name);}
}

super和this的区别

相同点:

  1. 都是Java中的关键字
  2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
  3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

不同点:

  1. this是当前对象的引用,而super相当于是子类对象中从父类继承下来部分成员的引用
  2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
  3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
  4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

初始化顺序

class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;System.out.println("构造方法执行");}{System.out.println("实例代码块执行");}static {System.out.println("静态代码块执行");}}

在上面这个代码中,执行的顺序是先执行静态的,再执行实例的,再执行构造方法;那在有继承关系的代码块中是什么样子呢?

class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;System.out.println("Person:构造方法执行");}{System.out.println("Person:实例代码块执行");}static {System.out.println("Person:静态代码块执行");}}class Student extends Person{public Student(String name,int age) {super(name,age);System.out.println("Student:构造方法执行");}{}System.out.println("Student:实例代码块执行");static {System.out.println("Student:静态代码块执行");}}

上面的代码执行结果如下:

  • Person: 静态代码块执行
  • Student:静态代码块执行
  • Person: 实例代码块执行
  • Person: 构造方法执行
  • Student:实例代码块执行
  • Student:构造方法执行

先是父类和子类静态方法执行,然后再是父类的实例和构造方法,再试子类的示例和构造方法。

final关键字

final关键可以用来修饰变量、成员方法以及类。

修饰变量

修饰变量或字段,表示常量(即不能修改)。

inal int a = 10;a = 20;  // 编译出错

修饰类

表示此类不能被继承。

inal public class Animal {...}public class Bird extends Animal {...}

编译出错。

修饰方法

表示该方法不能被重写

多态

简单地说,就是使用不同的对象去完成时会产生出不同的状态,所以叫做多态。

在java中要实现多态,必须要满足如下几个条件,缺一不可:

  1. 必须在继承体系下
  2. 子类必须要对父类中方法进行重写
  3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

class People{public void eat(){System.out.println("吃饭");}
}class Boy extends People{@Overridepublic void eat(){System.out.println("男孩子吃饭");}
}class Girl extends People{@Overridepublic void eat(){System.out.println("女孩子吃饭");}
}
public class demo12_Polymorphism2 {public static void main(String[] args) {People people = new People();Boy boy = new Boy();Girl girl = new Girl();people.eat();boy.eat();girl.eat();}
}

  • people.eat(); 将调用 People 类的 eat 方法,并打印 "吃饭"。
  • boy.eat(); 将调用 Boy 类重写的 eat 方法,并打印 "男孩子吃饭"。
  • girl.eat(); 将调用 Girl 类重写的 eat 方法,并打印 "女孩子吃饭"。

重写和重载

重写:

class dog {public void bark(){System.out.println("wangwangwang");}
}class pipi extends dog {@Overridepublic void bark(){System.out.println("houhouhou");}
}

访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected

父类被static、private修饰的方法、构造方法都不能被重写。

重载:

class dog {public void bark(){System.out.println("wangwangwang");}public void bark(int num){System.out.println("houhouhou");}
}

向上转型和向下转型

向上转型

Animal animal = new Cat("狗狗");

通过父类,新建一个子类的成员,这就是向上转型。

向上转型的优点:让代码实现更简单灵活。

向上转型的缺陷:不能调用到子类特有的方法。

向下转型

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时将父类引用再还原为子类对象即可,即向下转换。

向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。

Java中为了提高向下转型的安全性,引入 了instanceof,如果该表达式为true,则可以安全转换。

public class DowncastingExample {public static void main(String[] args) {// 向上转型:创建 Cat 类型的实例并赋值给 Animal 类型的引用Animal animal = new Cat("狗狗");// 下面进行向下转型,尝试将 Animal 类型的引用转换为 Cat 类型// 在转型之前,我们首先检查 animal 是否确实引用了 Cat 类的实例if (animal instanceof Cat) {// 安全进行向下转型Cat myCat = (Cat) animal;System.out.println("向下转型成功,猫的名字是:" + myCat.name);} else {System.out.println("引用的不是 Cat 类型的实例,转型失败。");}}
}

使用多态的好处

1. 能够降低代码的 "圈复杂度", 避免使用大量的 if - else

2. 可扩展能力更强

多态缺陷:代码的运行效率降低。

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

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

相关文章

Mybatis源码剖析---第一讲

Mybatis源码剖析 基础环境搭建 JDK8 Maven3.6.3&#xff08;别的版本也可以…&#xff09; MySQL 8.0.28 --> MySQL 8 Mybatis 3.4.6 准备jar&#xff0c;准备数据库数据 把依赖导入pom.xml中 <properties><project.build.sourceEncoding>UTF-8</p…

Linux学习笔记:线程

Linux中的线程 什么是线程线程的使用原生线程库创建线程线程的id线程退出等待线程join分离线程取消一个线程线程的局部存储在c程序中使用线程使用c自己封装一个简易的线程库 线程互斥(多线程)导致共享数据出错的原因互斥锁关键函数pthread_mutex_t :创建一个锁pthread_mutex_in…

雷电预警监控系统:守护安全的重要防线

TH-LD1在自然界中&#xff0c;雷电是一种常见而强大的自然现象。它既有震撼人心的壮观景象&#xff0c;又潜藏着巨大的安全风险。为了有效应对雷电带来的威胁&#xff0c;雷电预警监控系统应运而生&#xff0c;成为现代社会中不可或缺的安全防护工具。 雷电预警监控系统的基本…

makefile 编写规则

1.概念 1.1 什么是makefile Makefile 是一种文本文件&#xff0c;用于描述软件项目的构建规则和依赖关系&#xff0c;通常用于自动化软件构建过程。它包含了一系列规则和指令&#xff0c;告诉构建系统如何编译和链接源代码文件以生成最终的可执行文件、库文件或者其他目标文件…

Node.js知识点以及案例总结

思考&#xff1a;为什么JavaScript可以在浏览器中被执行 每个浏览器都有JS解析引擎&#xff0c;不同的浏览器使用不同的JavaScript解析引擎&#xff0c;待执行的js代码会在js解析引擎下执行 为什么JavaScript可以操作DOM和BOM 每个浏览器都内置了DOM、BOM这样的API函数&#xf…

开源模型应用落地-食用指南-以最小成本博最大收获

一、背景 时间飞逝&#xff0c;我首次撰写的“开源大语言模型-实际应用落地”专栏已经完成了一半以上的内容。由衷感谢各位朋友的支持,希望这些内容能给正在学习的朋友们带来一些帮助。 在这里&#xff0c;我想分享一下创作这个专栏的初心以及如何有效的&#xff0c;循序渐进的…

STM32F103C8T6 HC-SR04超声波模块——超声波障碍物测距(HAl库)

超声波障碍物测距 一、HC-SR04超声波模块&#xff08;一&#xff09;什么是HC-SR04&#xff1f;&#xff08;二&#xff09;HC-SR04工作原理&#xff08;三&#xff09;如何使用HC-SR04&#xff08;四&#xff09;注意事项 二、程序编写&#xff08;一&#xff09;CubeMX配置1.…

2024全新Langchain大模型AI应用与多智能体实战开发

2024全新Langchain大模型AI应用与多智能体实战开发 LangChain 就是一个 LLM 编程框架&#xff0c;你想开发一个基于 LLM 应用&#xff0c;需要什么组件它都有&#xff0c;直接使用就行&#xff1b;甚至针对常规的应用流程&#xff0c;它利用链(LangChain中Chain的由来)这个概念…

Facebook之魅:数字社交的体验

在当今数字化时代&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;承载着数十亿用户的社交需求和期待。它不仅仅是一个简单的网站或应用程序&#xff0c;更是一个将世界各地的人们连接在一起的社交网络&#xff0c;为用户提供了丰富多彩、无与伦比的数字社交体验。…

C++实现基础二叉搜索树(并不是AVL和红黑树)

本次实现的二叉搜索树并不是AVL数和红黑树&#xff0c;只是了解流程和细节。 目录 二叉搜索树的概念K模型二叉搜索树的实现二叉搜索树的架构insert插入find 查找中序遍历Inorder删除earse替换法的思路情况一 &#xff1a;假如要删除节点左边是空的。在左边时在右边时 情况二&a…

文心智能体,零代码构建情感表达大师智能体

前言 随着智能体技术的突飞猛进&#xff0c;各行各业正迎来前所未有的变革与机遇。智能体&#xff0c;作为人工智能领域的重要分支&#xff0c;以其自主性、智能性和适应性&#xff0c;正逐步渗透到我们生活的每一个角落&#xff0c;成为推动社会进步和科技发展的新动力。 为了…

visual studio 2022 ssh 主机密钥算法失败问题解决

 Solution - aengusjiang 问题&#xff1a; I follow the document, then check sshd_config, uncomment“HostKey /etc/ssh/ssh_host_ecdsa_key” maybe need add the key algorithms: #HostKeyAlgorithms ssh-ed25519[Redacted][Redacted]rsa-sha2-256,rsa-sha2-512 Ho…

Redis常用命令——String篇

前面我们讲解了一些 Redis 的全局命令&#xff08;Redis常用基本全局命令&#xff09;。所谓全局命令&#xff0c;就是可以匹配任意一个数据结构进行使用。但是不同的数据结构&#xff0c;也有自己的操作命令。本篇文章主要讲解的是 String 的操作命令&#xff0c;希望会对你有…

ClickHouse课件

列式存储数据库&#xff1a;hbase clickhouse 简介 ClickHouse入门 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用…

2024年电工杯B题论文首发+问题一论文代码分享

问题一论文代码链接&#xff1a;https://pan.baidu.com/s/1kDV0DgSK3E4dv8Y6x7LExA 提取码&#xff1a;sxjm --来自百度网盘超级会员V5的分享 基于数据分析的大学生平衡膳食食谱的优化设计及评价 摘要 大学时期不仅是学术学习和身体成长的关键阶段&#xff0c;更是青年学生…

Hsql每日一题 | day03

前言 就一直向前走吧&#xff0c;沿途的花终将绽放~ 题目&#xff1a;打折日期交叉问题 如下为平台商品促销数据&#xff1a;字段为品牌&#xff0c;打折开始日期&#xff0c;打折结束日期 brand stt edt oppo,2021-06-05,2021-06-09 oppo,2021-06-11,2021-06-21 vivo,…

Java中流的概念细分

按流的方向分类&#xff1a; 输入流&#xff1a;数据流向是数据源到程序&#xff08;以InputStream、Reader结尾的流&#xff09;。 输出流&#xff1a;数据流向是程序到目的地&#xff08;以OutputStream、Writer结尾的流&#xff09;。 按处理的数据单元分类&#xff1a; 字…

PVE 虚拟机环境下删除 local-lvm分区

1、删除逻辑卷 lvremote pve/data 2、扩展逻辑卷 lvextend -l 100%FREE -r pve/root 3、 修改存储目录内容 点击 Datacenter - Storage &#xff08;1&#xff09;删除local-lvm分区 &#xff08;2&#xff09;编辑local分区&#xff0c;在内容一项中勾选所有可选项。

Spring Boot 3.3 正式发布,王炸级更新,应用启动速度直接起飞!

最新消息&#xff0c;Spring Boot 一次性发布了 3 个版本&#xff1a; 3.3.0 3.2.6 3.1.13 Spring Boot 3.3 正式发布了&#xff0c;3.1.x 在前几天也停止维护了。 最新的支持版本如下&#xff1a; 从路线图可以看到每个版本的终止时间&#xff0c;每个版本的生命周期只有…

clickhouse 中的数组(array)和元组(Tuple)—— clickhouse 基础篇(二)

文章目录 数组判断是否为空计算数组长度获取数组元素判断某个元素是否存在数组切片数组元素展开数组元素去重删除连续重复元素连接多个数组数组倒序数组拍平数组元素映射数组元素过滤数组聚合分析计算数组交集计算数组并集计算数组差集SQL 子查询进行集合操作 元组创建元组获取…