继承和多态

继承

继承:

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例 域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

生活中的继承:

继承的概述:

  • 继承是面向对象程序设计的一个重要特征,它是通过继承原有类派生出子类,进而构造出更为复杂的子类。
  • 子类既有新定义的行为特征,又继承了原有类的行为特征。
  • 父类与子类存在着包含与被包含的关系,是一种is-a的关系。
  • 在Java中继承可以在现有类的基础上进行功能的扩展,这样能够更加快速地开发出新类,使新类不仅可以复用当前类的特征和行为而且还可以定义自己的特征和行为。
  • 通过继承可大幅度提高代码的复用性,减少代码量,便于程序的后期维护。

*Java继承语法:*

[修饰符] class 子类名  extends 父类名{//类定义部分}

父类也称为基类或超类

继承的实现:

*示例:*定义父类武器,以及子类圣剑和长矛

public class Weapon { //父类  武器String name;//武器名int attackValue;//攻击值//构造方法public Weapon(String name, int attackValue) {System.out.println("--执行武器父类Weapon的构造方法--");this.name = name;this.attackValue = attackValue;}//攻击方法public void attack(){System.out.println("武器名:"+name+"\t"+"攻击值:"+attackValue);}}
public class Sword extends Weapon{ //圣剑  子类public Sword(String name, int attackValue) {super(name, attackValue);}
}
public class Spear extends Weapon{ //圣剑  长矛//构造方法public Spear(String name,int attackValue) {super(name, attackValue);}
}
public class ExtendsTest { // 测试类public static void main(String[] args){Sword word = new Sword("圣剑",300);word.attack();Spear spear = new Spear("长矛",250);spear.attack();}
}

多态

多态:

从一定角度来看,封装和继承几乎都是为多态而准备的。

多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

在编译时,可以通过父类的引用指向子类对象,而在运行时,则通过父类所指向的子类对象,调用子类中重写父类的方法。

多态的应用:

示例:指向子类的父类引用在执行重写方法时所体现的多态性

//父类 人物
public class Figure {protected String name;public void attack(){//此处不进行具体的攻击操作,不同职业的英雄攻击方式不同}public  void run(){		System.out.println("在奔跑");}
}//子类 战士
public class Warrior  extends  Figure{//重写父类的attack()方法public void attack(){System.out.println(this.name+"正在物理攻击......");}
}
//子类 法师
public class Master extends Figure {//重写父类的attack()方法public void attack(){		System.out.println(this.name+"正在魔法攻击......");}	public static void main(String[] args) {Figure master=new Master();master.name="恶魔巫师";Figure warrior=new Warrior();warrior.name="撼地神牛";master.attack();warrior.attack();}
}

img

引用变量的强制类型转换:

示例:调用父类引用的方法没有在父类进行定义

//子类 法师
public class Master extends Figure {//重写父类的attack()方法public void attack(){		System.out.println(this.name+"正在魔法攻击......");}//子类特有的轰炸功能public void bomb(){System.out.println(this.name+“正在魔法轰炸......");}	public static void main(String[] args) {Figure figure=new Master();figure.name="恶魔巫师";figure.attack();figure.bomb(); //此处编译出错}
}

分析:

引用变量只能调用其编译时类型的方法,而不能调用运行时类型的方法,即 使实际所引用的对象确实包含该方法。

如果需要让引用变量调用运行时类型的方法,则必须将其强制类型转换为运 行时类型,强制类型转换需借助于类型转换运算符。

instance of 运算符

*instance of* 运算符用于判断一个实例是否为某个类的实例

语法:

a instanceof A

判断实例a是否为类A的实例,如果为真则返回true,否则返回false。

//子类 法师
public class Master extends Figure {//重写父类的attack()方法public void attack(){		System.out.println(this.name+"正在魔法攻击......");}//子类特有的轰炸功能public void bomb(){System.out.println(this.name+“正在魔法轰炸......");}	public static void mafigurein(String[] args) {Figure figure=new Master();figure.name="恶魔巫师";figure.attack();if(figure instanceof Master )Master master = (Master)figure; // 使用向下类型转换master.bomb();   //成功调用Master类的bomb}
}

总结:
声明包的语句是“package 包名”,该语句必须放在第一行,导入类的语句是 “import 包名.类名”。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例 域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
子类继承父类的语法是:“[修饰符] class 子类名 extends 父类名”。
重载就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
重写就是在子类方法重写父类方法,重写的方法和被重写的方法必须具有相同方法名称、参数
列表和返回类型。
多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
在编译时,可以通过父类的引用指向子类对象,而在运行时,则通过父类所指向的子类对象,调用子类中重写父类的方法。

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

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

相关文章

数据的存储和排列

大端方式和小端方式边界对齐

中位数

题目题解1. 首先我们可以想到,既然需要输出(n+1)/2次,所以我们可以每次排序一下,并在其为奇数的时候输出它们中间的数。 #include<iostream> #include<algorithm> #include<queue> using namespace std; int N; int a[100001]; int main() { cin >&g…

Unity Gyro Camera ---- 传感器控制摄像头旋转 + 正北校准 (纯原生支持Android+IOS,无需安装ARKit,ARCore等插件)

Unity Gyro Camera 传感器控制摄像头旋转 + 正北校准 纯原生支持Android+IOS,无需安装ARKit,ARCore等插件这篇文章主要介绍如何利用手机原生的传感器,控制摄像头的旋转,最终可以实现AR或者VR的摄像头旋转控制问题提出 虽然,目前有一些用手机传感器控制虚拟摄像头旋转的方案…

浮点数的表示及IEEE754标准

浮点数的表示浮点数的规格化IEEE754标准 移码IEEE754这里有一个需要特别注意的地方,IEEE754中,尾数个位上的1是隐含的IEEE 的阶码保留了全0和全1来表示特殊的状态,所以阶码最大值的真值为127,对应机器数为1111 1110,阶码最小值的真值为-126,对应的机器数为0000 0001

记一次STM32使用I2C PinRemap引脚重映射出现卡死现象

在移植WouoUI到STMF103C8 BluePill board时,发现会出现上电卡死在I2C检查函数(如下图)本人遇到的现象:在习惯使用的(SWI2C / HWI2C)@(PB8->SCL PB9->SDA)连接OLED的情况下,大多数情况使用江科大的SWI2C,一切正常。今天跑某开源基于u8g2库的UI框架 WouoUI(HWI2C)…

rancher2.5.9部署flink1.13.1集群问题求教

下面是我在rancher页面配置flink的yaml: apiVersion: batch/v1 kind: Job metadata: name: flink-jobmanager namespace: flink-resource spec: template: metadata: labels: app: flink component: jobmanager spec: restartPolicy: OnFailure containers: - name: jobmanage…

【报错提示】java.lang.RuntimeException: Cant create handler inside thread

​ 报错提示 遇到一个报错: java.lang.RuntimeException: Cant create handler inside thread Thread[OkHttp https://a.fxltsbl.com/...] that has not called Looper.prepare() 分析1. 这个报错提示是在一个没有调用 Looper.prepare() 的线程中尝试创建一个 Handler 对象。…

洛谷-P9830 题解

思路分析 分析样例:见红线,长宽各为 2,存在格点;黄线长 2 宽 3,没有格点。 考虑延长黄线使得长 4 宽 6,发现有格点。思考格点,如果长和宽都可以被分成 \(p\times l\) 的格式,则存在格点。那么,就能想出: 推论 1:对于 \((0 \ , \ 0)\) 和 \((x \ , \ y)\) 之间没有格…

kubernetes-存储卷与持久化详解

目录背景volume介绍emptyDirHostPathNFSconfigMapSecretPersistentVolume介绍PV回收策略PV访问策略基于nfs或nas创建pv创建hostpath类型的pvPV的状态PersistentVolumeClaim创建pvc与pv进行绑定使用pvc动态存储storageclass创建目录nfs添加授权目录创建yaml 背景 容器部署过程中…

如何通过视频剪辑软件修复原始视频声音小的问题 All In One

如何通过视频剪辑软件修复原始视频声音小的问题 All In One 视频后期处理 (剪映)如何通过视频剪辑软件修复原始视频声音小的问题 All In One视频后期处理 (剪映)demos视频声音太小了, 音量开到 100%,还是听不清,建议加个麦,或者后期处理视频的时候提高音量https://www.bilib…

kettle从入门到精通 第八十四课 ETL之kettle kettle中Get data from XML使用实战教程

场景:解析xml文件或者内容解析出其中某些字段。 本来想着这个步骤使用起来比较简单,就没有梳理成文,结果群里的小伙伴为了使用这个步骤折腾了一下午。故有了此文。 在开始学习之前我们一起来学习下xml命名空间的相关知识,为下文展开做基础铺垫。 1、xml命名空间XML 的命名空…

双边滤波

双边滤波(Bilateral Filtering)是一种非线性的图像处理方法,主要用于图像的平滑同时保持边缘清晰。与传统的低通滤波器(如均值滤波或高斯滤波)不同,双边滤波不仅考虑了空间上的邻近性,还考虑了像素值的相似性,这使得它能够在去除噪声的同时较好地保留图像的边界和细节。…