java面向对象(4)

目录

1.多态

1.1如何构成多态

1.2多态的调用规则

1.3多态的向下转型

1.4 instanceof运算符

1.5多态的好处

2.final关键字

3.接口

3.1接口中可以定义哪些成员

3.2接口的使用

3.2接口的特性


1.多态

多态:同一种事物,在不同的时刻表现出不同的状态

1.1如何构成多态

当两个类有直接或间接的继承关系并且父类的引用指向子类对象时就构成了多态

eg:

Animal dog = new Dog();

Animal cat = new Cat();

1.2多态的调用规则

(1)成员方法:编译看左边,运行看右边

编译看左边:在编译期间能调到哪些方法,取决于左边父类的类型

运行看右边:在运行期间,调用的是谁的方法,取决于创建的是谁的对象

(2)静态方法:编译和运行都看左边

对于静态方法,是随着类的加载而加载,并不在对象当中,所以调用时只看左边父类的类型

(3)成员变量:编译和运行都看左边

1.3多态的向下转型

当我们想使用多态时,我们迫不得已将子类类型全部提升为父类类型,这就导致了我们无法调用到子类所特有的方法,为了解决这一问题,多态还存在着向下转型

多态的向下转型就是为了子类能调用到自己独有的方法

注意:

(1)向下转型的前提是向上转型

eg:

Animal dog1 = new Dog();

Dog dog2 = (Dog) dog1;

Animal cat1 = new Cat();

Dog dog3 = (Dog) cat1;//这是错误的

上述两行代码即可实现向下转型,但一定切记将dog1转为Dog类时,dog1这个引用必须指向的是一个Dog对象,不能指向其他类型的对象,换句话说,不能将一个指向猫对象的引用转为狗对象,猫是猫,狗是狗,两者没什么关系

为了避免上述这种类转换异常,java提供了一个运算符instanceof

1.4 instanceof运算符

instanceof运算符是一个比较运算符,它可以用来判断运算符左边对象的类型是否等于右边给定的类的类型,相等返回true,否则返回false

使用:

对象 instanceof 类名

 public void putAnimal(Animal animal) {System.out.println("把" + animal.getName() + "装进冰箱");animal.eat();//instanceof 表示父类类型中持有实际类型 是否是指定的类型//父类类型与指定类型相同返回true否则返回falseif(animal instanceof Dog){Dog dog = (Dog)animal;dog.lookhome();}}

1.5多态的好处

提高了代码的可扩展性,减少了代码的冗余

2.final关键字

final关键字可以用来修饰类,成员变量,成员方法,方法中的参数

1.当final修饰类时,表示该类不能被继承

2.当final修饰成员方法时,表示该方法不能被重写

3.当final修饰方法中的参数时,表示该参数在该方法中不能被修改

4.当final修饰成员变量时,它表示该成员变量成为了常量,即一旦初始化就不能修改,此时分为两种情况

(1)情况一:在定义时就初始化,此时相当于所有对象中都有一份值相同的常量值,那不如将其定义为static的,这样,在内存中只存在一份这个值且被所有对象共享.

eg:static final MAX_VALUE = 100;

(2)情况二:在构造方法中初始化,此时相当于每份对象中都有一个该常量,且该常量的值可以自定义

3.接口

接口可以看作是一个特殊的抽象类,在java中用关键字Interface定义一个接口

3.1接口中可以定义哪些成员

(1)常量

在接口中可以直接int num;通过定义变量的方式去定义常量,因为编译器会默认加上public static final,也就是说在接口中 int num == public static final int num;

(2)抽象方法

在接口中可以 void eat();这样来定义一个抽象方法,编译器会默认加上public abstract,也就是说在接口中 void eat() == public abstract void eat();

(3)静态方法

在接口中可以static [返回值] 方法名(参数列表){方法体};来定义一个静态方法,编译器会默认加上public

(4)默认方法

在接口中可以 default [返回值] 方法名(参数列表){方法体};来定义一个默认方法,默认方法是为了让继承该接口的子类在想重写时重写

但在jdk8之前接口中只能定义抽象方法和常量

3.2接口的使用

一个类通过implements来实现多个接口,实现接口时,要么重写接口中的抽象方法,要么将该类声明为抽象类,一个接口通过exends来继承多个接口

public interface InterfaceA {void sleep();
}//一个接口通过extends继承多个接口
public interface InterfaceB extends InterfaceC, InterfaceD {void play();
}public interface InterfaceC {}public interface InterfaceD {}//一个类通过extends继承一个类并通过implements实现多个接口,并重写接口中的抽象方法
public class MyClass extends Object implements MyInterface,InterfaceA,InterfaceB{@Overridepublic void sleep() {}@Overridepublic void play() {}@Overridepublic void eat() {}
}

3.2接口的特性

(1)接口是隐式的抽象,主要用来定义功能

(2)接口中可以定义常量,抽象方法,静态方法,默认方法

(3)一个接口能继承其他多个接口

(4)接口不能实例化对象

(5)接口是要被类实现,一个接口可以被多个类实现

(6)当类实现接口时必须要实现接口中的抽象方法,否则要将该类定义为抽象类

(7)接口与实现类之间存在多态性

public class MyClass implements MyInterface{public static void main(String[] args) {//接口和实现类之间存在多态性MyInterface myInterface = new MyClass();}}

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

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

相关文章

yii2 ActiveForm使用技巧

持续更新&#xff1a; 1、搜索输入框&#xff1a;form-inline <?php $form ActiveForm::begin([action > [index],method > get,options > [class > form-inline] &#xff08;增加此行代码&#xff09; ]); ?>

PBR网络数据流量分流+NQA联动静态路由

一、实验目的&#xff1a; 企业有两个网段&#xff0c;业务1网段和业务2网段&#xff0c;拓扑图如下&#xff0c; 二、实验要求 pc1报文走左侧链路到达ar1&#xff0c;pc2报文走右侧链路到达ar1&#xff0c;且当ar2或者ar3发生故障时候&#xff0c;可以通过另一个设备到达ar1…

1.4 Kettle 数据同步工具详细教程

工具介绍 一、概述 Kettle&#xff0c;又名 Pentaho Data Integration&#xff08;PDI&#xff09;&#xff0c;是一个开源的数据集成工具&#xff0c;最初由 Pentaho 公司开发。它能够从多种数据源提取、转换并加载&#xff08;ETL&#xff09;数据&#xff0c;适用于数据仓…

字符串根据给定关键词进行高亮显示

问题 一般使用搜索引擎的时候我们会发现,搜索出来的内容都对我们搜索的关键词进行了高亮显示, 这样我们能很直观的看出是不是我们想要的结果, 最近我也遇到了类似的功能, 因为关于舆情的系统使用到了ES, 一开始心想ES本身就有支持的API实现起来不难, 但我这里的需求还不太一样…

Altera的JTAG电路下载模块为何上下拉电阻,不可不知的秘密

一、FPGA背景信息 当前的FPGA市场上有国际和国产两大体系&#xff0c;国际排名&#xff0c;一直很稳定&#xff0c;国际上前三名Xilinx、Altera、Lattice&#xff0c;国内FPG厂商也在填补空白&#xff0c;低端、中低端市场上发力&#xff0c;替代潮流已在兴起&#xff0c;目前…

【驱动篇】龙芯LS2K0300之单总线驱动

实验过程 实验目的&#xff1a; 在龙芯开发板上面使用单总线驱动DS18B20温度传感器 ① 根据原理图连接DS18B20模块 ② 将i2c0引脚的功能复用为GPIO ③ 注册字符设备&#xff0c;按照DS18B20的读写时序编写读写驱动接口 ④ 编写测试用例解析传感器的数值 原理图 将板子上…

jupyter notebook 中使用ipython 魔法指令整理

在 Jupyter Notebook 中&#xff0c;IPython 魔法指令为数据分析和探索提供了很多便利。以下是一些常见且实用的 IPython 魔法指令及其用法&#xff1a; 1. %timeit 魔法指令 用于测量一段代码的执行时间。 %timeit [i for i in range(1000)]2. %matplotlib inline 魔法指令…

政务云VMware私有云企业云平台建设参考学习方案资料

下面资源来源于网络&#xff0c;如有侵权请联络删除&#xff01; NetApp私有云及虚拟化解决方案&#xff08;49页&#xff09;.pptx Openstack构建企业私有云.pdf VMware私有云解决方案&#xff08;84页&#xff09;_.docx 上海市政务云管理暂行办法.pdf 私有云平台实施方案…

马尔可夫聚类算法

马尔可夫聚类算法&#xff08;Markov Clustering Algorithm&#xff0c;MCL&#xff09;是一种用于图聚类的算法&#xff0c;广泛应用于生物信息学、社交网络分析、推荐系统等领域。 其核心思想是模拟随机游走过程&#xff0c;通过迭代地扩散和收缩图上的概率分布来识别图中的…

章十九、JavaVUE —— 框架、指令、声明周期、Vue-cli、组件路由、Element

目录 一、 框架 ● vue.js 框架 ● 特点 ● Vue 安装 二、 第一个vue程序 ● 创建项目 ​编辑 ● 导入 vue.js ● 创建vue对象&#xff0c;设置属性&#xff0c;使用模版渲染到页面 介绍 — Vue.js (vuejs.org) 三、 vue指令 ● v-text ● v-html ● v-…

LeetCode 671.二叉树第二小的结点

这个题我们可以用数组辅助完成&#xff0c;然后进行排序后&#xff0c;再用再进行取值&#xff0c;这是我的代码块: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/void Preorde…

【07】持久化-数据库选择和设计

1. 数据库选择 在比特币原始论文中,并没有提到要使用哪一个具体的数据库,它完全取决于开发者如何选择。Bitcoin Core ,最初由中本聪发布,现在是比特币的一个参考实现,它使用的是 LevelDB。 我们将要使用的是BoltDB。Bolt DB是一个纯键值存储的 Go 数据库。没有具体的数据…

上海市计算机学会竞赛平台2023年9月月赛丙组分形扩张

题目描述 一开始&#xff0c;你只有一个数字&#x1d460;s&#xff0c;&#x1d460;s 只可能为 00 或 11。接下来&#xff0c;你需要将这个数字扩张 &#x1d45b;n 轮&#xff0c;最后变成一个 2&#x1d45b;2&#x1d45b;2n2n 的矩阵&#xff0c;每轮的扩张规则如下&…

uniapp scroll-view 虚拟滚动【适合每条数据高度一致】

基本原理 有一万条数据&#xff0c;我们按10条一页来进行分组&#xff0c;会有1000页页面滚动到第10页的位置的时候&#xff0c;10页之后和10页之前是不用被显示的&#xff0c;可以直接隐藏掉如果是数据删除&#xff0c;页面会不流畅&#xff0c;会卡顿一下&#xff0c;且滚动位…

vue-cli搭建

一、vue-cli是什么&#xff1f; vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;…

一个使用Python和假设的天气API来获取和展示天气数据的简单脚本示例

要使用Python编写一个天气预测的脚本&#xff0c;我们通常需要依赖于现有的天气API来获取实时或历史天气数据&#xff0c;并且结合机器学习或统计模型来进行预测。然而&#xff0c;由于天气预测是一个复杂的任务&#xff0c;通常需要大量的计算资源和专业的气象知识&#xff0c…

QT事件处理系统之二:窗口部件的事件拦截,以及事件的传递顺序

1、案例说明 在父窗口中为selfLineEdit窗口安装事件过滤器,这样我们可以在父窗口中首先拦截来自于selfLineEdit本身产生的事件,并且决定该事件最终是否继续传递到selfLineEdit窗口本身。 2、关键代码 selfLineEdit.cpp #include "selfLineEdit.h" #include &l…

ECM和MEMS技术在心肺声学监测中的应用

心肺疾病是全球范围内导致死亡的主要原因。因此&#xff0c;对这些疾病迹象的准确和快速评估对于为患者提供适当的医疗保健至关重要。心血管疾病最重要的迹象之一是心脏周期的异常。大多数呼吸系统疾病则表现为呼吸周期的异常。有多种方法可以监测心脏和肺部的周期。听诊是监测…

pytest测试框架pytest-xdist插件并发执行测试用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下插件pytest-xdist&#xff0c;主要是提供并行测试、分布式测试、循环测试等功能&#xff0c;可以加快测试速度。 pytest-xdist官方显示没有严格的python和pytest版本限制。 pytest-xdist安装 使用pip命令安装: pip…

java内置线程池

线程池常见方法 如何获取线程池对象 缓存线程池 自定义任务对象 public class MyRunnable implements Runnable{private int id;public MyRunnable(int id) {this.id id;}Overridepublic void run() {String name Thread.currentThread().getName();System.out.println(&quo…