java继承,多态及相关学习笔记

Java基础—封装继承多态(详细) 面向对象三大特征 封装 继承 多态1.封装定义:就是把事物封装成类,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。 阅读详情

1.继承

继承指的是子类对父类中的属性以及方法的继承。即申明继承后,父类中定义过的属性和方法子类默认全部拥有。可以实现代码的复用减小工作量和源码体积。以下是一个子类SunClass对父类SuperClass的继承的例子:

Public classSubClass extends SuperClass(){

......

}

2.多态

如果要解释多态,就必须先来说一下什么是is-a。先观察下面一段代码:
         //在这里,Cat是Pet的子类

Cat mimi=new Cat();

Pet cat=new Pet();

第一行定义了一个Pet类的新对象,第二行定义了一个Cat类的新对象,一切正常。那么这样呢?

Cat mimi=new Cat();

Pet cat=mimi;

试一下就可以知道,上面的两行都能通过编译,但是下面的却不行了:

Pet cat=new Pet();

Cat mimi=cat;

原因就是,编译器认为,宠物不是一种猫,而猫是一种宠物,所以将宠物类的对象赋值给猫类的对象是允许的,但是把猫类的对象赋值给宠物却是非法的。

因为 Cat is a Pet 所以 Pet cat=mimi 成立。编译器会将子类自动“提升为父类”,但是被提升为父类后,仍然拥有子类中的属性。这有什么用呢?来看下面一个要求。

要求设置一个动物类,动物类中有weight和getWeight()方法,然后有两个子类分别是猫和鸟,现在请设计static方法返回所有动物的体重,比较好的一个办法是重载,即在main()方法中定义2个重名方法:

Public static void getWeight(Cat cat){

cat.getWeight();

}

Public static void getWeight(Bird bird){

bird.getWeight();

}

然后在main()中调用getWeight(cat)或者getWeight(bird),这样根据参数的不同,就可以自动得到和对象对应的体重了。但是如果有很多种动物的情况下,还是会造成大量的重复代码。

但是如果鸟和狗都继承自Animal类的话,就可以用如下方法避免代码的重复

//在main()方法中定义

getWeight(Animal animal){

animal.getWeight();//getWeight()为Animal类中的方法

}

然后

建立getWeight(Animal animal)函数调用之:

getWeight(bird);

getWeight(cat);

因为鸟is a Animal,狗 is a Animal,所以调用getWeight(Animal animal)时,会自动参考传入的是bird还是cat来返回对应的体重值,这样,即使有100动物类的子类,也能用一个getWeight()函数解决,而不需要重载100个函数。

现在就可以解释什么是多态了。上面的getWeight()函数能够通过一个接收animal类的方法来实现对animal下子类多个对象的操作。通过同一个方法既可以操作cat的特有动作,又可以操作bird的特有动作,这就是多态。抽象的说法是,通过单一的方法操作多种类型的对象。

3.方法重定义

现在有个需求,要求定义一个static方法操作bird和cat,使它们eat(),你可能想到了上面提到的多态,public static void eat(Animal animal)但是由于不同动物的吃饭方式的实现方式是不同的等原因,Animal类中并没有eat()方法,因此会导致编译报错。

但是如果cat和bird中都有eat()方法,即方法时同名的,只是方法操作内容不同,就可以把eat()提升到Animal类中定义:

Public void eat(){

//方法体是空的}

因为只有动物的子类中才知道eat()应该如何操作,所以Animal类中的方法体是空的,当Cat继承Animal类后,在对其内容进行定义:

Public void eat(){

System.out.println(“喵呜喵呜。。。”);

}

在继承父类后,定义和父类名字相同的方法,但执行内容不同,这就叫做方法的重定义(Override)。由于Animal现在定义了eat(),所以编译就能通过了。那编译器是否能够正确无误的执行期望的对象的方法呢?如果传入的参数是Cat 的mimi对象,animal参数参考的就是mimi实例,即如果public static void eat(cat),则会执行mimi对象中的eat().这样就能使用上面提到的多态来解决这个问题了。

但是子类中重新定义的方法名必须和父类中相同,对于父类中的eat()来说,如果在子类Cat中定义为aet()则属于另一个方法了,虽然并不会报错,但是在运行时你会发现并没有执行到cat.eat()。为了避免这种错误,可以使用标注@Override来让编译器帮你检查是否真的对父类中的方法进行了重定义。标注使用方法为:

@Override

Public void eat(){

......

}

这样当方法名打错时,编译器会在提示你必须重定义或者实现一个父类的方法。

4.抽象类

上一个例子中,为了实现多态,而把子类中的方法提升到父类中进行定义,但是由于父类中并不知道执行何种动作,所以留空,而让子类自动执行相应的动作。但是这依赖于程序的自动执行,但是并没有显式的告诉别人你的目的。这种情况下,如果方法中真的没有仍和代码需要执行,就可以使用抽象类关键词abstract来表示该方法为抽象方法:

Public abstract void eat();//注意,没有{},只是在()后加了一个分号表示方法声明结束。

一个类中如果有抽象方法,则说明该类没有定义完全,所以不能用来生成对象。所以该类也是一个抽象类,必须用abstract关键字来修饰:public abstract class Animal(){......}。当有子类继承一个抽象类时,必须在子类中对抽象方法进行处理:要么继续用abstract关键字修饰之,要么写出该方法的实现方式。如果没有对抽象类进行处理,则会引发编译器报错。

 下面是一个简单的综合应用了以上知识的小练习:

//父类——Role

package com.wmr.bigwar;

public abstract class Role{
	//属性
	private String name;
	protected int blood;
	private int atk;
	private int level;
	
	//构造方法
	public  Role(){}
	
	//普通方法
	public abstract boolean fight(Role beAtkRole);
	public abstract boolean beAtk(int atk);
	
	public String getName(){
		return this.name;
	}
	
	public boolean setName(String name){
		this.name=name;
		return true;
	}
	
	public  int getBlood(){
		return this.blood;
	}
	
	public  boolean setBlood(int blood){
		this.blood=blood;
		return true;
	}
	
	public  int getAtk(){
		return this.atk;
	}
	
	public  boolean setAtk(int atk){
		this.atk=atk;
		return true;
	}
	
	public  int getLevel(){
		return level;
	}
	
	public  boolean setLevel(int level){
		this.level=level;
		return true;
	}
	
}

 //Role类的继承类——MagicMan

package com.wmr.bigwar;

public class MagicMan extends Role{
	//属性
	
	//构造方法
	public MagicMan(){
		this.setName("卡尔");
		this.setBlood(1000);
		this.setAtk(200);
		this.setLevel(1);
	}
	
	//普通方法
	@Override
	public boolean fight(Role beAtkRole){
		System.out.println(this.getName()+"向"+beAtkRole.getName()+"施展了陨石术!");
		return beAtkRole.beAtk(this.getAtk());
	}
	
	public boolean beAtk(int atk){
		super.blood-=atk;
		if(super.blood>0){
			System.out.println(super.getName()+"受到了攻击,还剩"+super.blood+"血");
			return false;}
		else{
			System.out.println(super.getName()+"受到了致命攻击,死了");
			return true;}
	}
	
}

 //Role类的继承类——SwordsMan

package com.wmr.bigwar;

public class SwordsMan extends Role{
	//属性

	//构造方法
	public SwordsMan() {
		this.setName("剑圣");
		this.setBlood(1600);
		this.setAtk(100);
		this.setLevel(1);
	}
	
	//普通方法
	@Override
	public boolean fight(Role beAtkRole){
		System.out.println(this.getName()+"向"+beAtkRole.getName()+"施展了剑气!");
		return beAtkRole.beAtk(this.getAtk());
	}
	
	public boolean beAtk(int atk){
		super.blood-=atk;
		if(super.blood>0){
			System.out.println(super.getName()+"受到了攻击,还剩"+super.blood+"血");
			return false;}
		else{
			System.out.println(super.getName()+"受到了致命攻击,死了");
			return true;}
	}

}

 //主类

package com.wmr.bigwar;

public class TestFight {

	//必须为static方法,因为main()函数是static,
	//而static方法在本类中只能调用其他static方法
	public static boolean doFight(Role atkRole,Role beAtkRole){
		return atkRole.fight(beAtkRole);
	}
	//
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwordsMan sM = new SwordsMan();
		MagicMan mM=new MagicMan();
		System.out.println("卡尔的血量为"+mM.getBlood());
		System.out.println("剑圣的血量为"+sM.getBlood());
		
		boolean die=false;
		while(!die){
			die=doFight(mM,sM);
			if(die)
				break;
			else {
				die=doFight(sM,mM);
			}
		}
		
	}

}

 //执行结果:

卡尔的血量为1000
剑圣的血量为1600
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩1400血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩900血
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩1200血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩800血
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩1000血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩700血
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩800血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩600血
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩600血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩500血
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩400血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩400血
卡尔向剑圣施展了陨石术!
剑圣受到了攻击,还剩200血
剑圣向卡尔施展了剑气!
卡尔受到了攻击,还剩300血
卡尔向剑圣施展了陨石术!
剑圣受到了致命攻击,死了

 

C++继承与多态 - 继承多态原理01 C++继承多态原理讲解 阅读详情

相关推荐

Java开发者必备:Ollama4j客户端库全面指南与实战

在AI应用开发领域,本地部署大型语言模型(LLM)已成为降低成本和提升隐私安全的重要趋势。其核心原理是通过REST API与模型服务器交互,实现文本生成、对话和语义理解等功能。这一技术为Java生态系统带来了显著的工程价值,使开发者能够便捷地将AI能力集成到企业级应用中。Ollama4j作为一款专为Java设计的轻量级客户端库,通过封装底层HTTP通信和JSON处理,提供了类型安全、面向对象的API,极大地简化了与Ollama服务器的交互。它全面支持流式生成、多轮对话、嵌入向量计算以及高级的**工具调用**

weixin_28295799的博客 436

JavaSE—继承与多态

java继承和多态

taro_yuan的博客 334

香橙派R1 Plus LTS变身无线AP/客户端:手把手教你用RTL8811CU和MT7601U网卡刷OpenWRT

本文详细介绍了如何将香橙派R1 Plus LTS开发板通过RTL8811CU和MT7601U两款USB无线网卡刷入OpenWRT系统,实现无线AP热点发射与客户端接入的双重功能。从硬件选型、驱动安装到双网卡协同配置,提供完整的实战指南,帮助用户快速搭建稳定高效的无线网络解决方案。

weixin_30919429的博客 408

(java)继承和多态 (详解)

1 继承 1.1为什么需要继承 1.2 继承概念 1.3 继承的语法 1.4 父类成员访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 1.6 子类构造方法 1.7 super和this 1.7.1 this 1.7.2 super和this 1.8 再谈初始化 1.9继承方式 1.10继承与组合 2 多态 2.1 多态的概念 2.2 多态实现条件 2.3 重写 2.4 向上转移和向下转型

iiiiiihuang的博客 5476

适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)

yolov8源码下载地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLiteyolov8使用文档: Home - Ultralytics YOLOv8 Docs教学视频参考: 包会!YOLOv8训练自己的数据集_哔哩哔哩_bilibili先用conda prompt创建一个虚拟环境,我的叫yolov8, python版本用3.10 源码地址:GitHub - ul

CV在读 25万+

SRAM Bank数量配置:性能、面积与功耗的权衡指南

SRAM(静态随机存取存储器)是芯片设计中的关键存储单元,其Bank数量配置直接影响访问延迟、吞吐率、功耗和面积。Bank切分通过将存储阵列分区,缩短位线和字线延迟,从而提升性能,但会增加外围电路开销。合理配置Bank数量可优化PPA(性能、功耗、面积),在28nm和16nm工艺下,2个Bank通常是性价比最高的选择。本文基于实测数据,探讨不同场景下的Bank配置策略,帮助工程师避免常见误区,提升设计效率。

weixin_27230891的博客 179

(java) 继承&多态

本片主要内容为 继承和多态 ,涉及java中继承的特点,方法重写,子类构造器的特点,以及多态形成的条件,同时 举例补充了关于访问修饰符的内容

m0_56827189的博客 947

plc secs半导体通讯协议 PLC 与MES的SECS/GEM通讯方案

符合SEMI E4, E5, E30, E37 的 SECS/GEM通讯方案 专业稳定的产品,持续运行5年都不出错 遵循 SEMI 人机交互设计,提供触摸屏支持让你触手可及。 毫米级的响应,单个messge在5ms以内 MES与PLC之间达到实时性,如采集实时性的数据 每秒支持100条Message以上 快速搭建PLC与MES之间的SECS/GEM桥梁,只需简单配置数据 SECS/GEM介绍 遵循 SEMI 人机交互设计,提供触摸屏支持让你触手可及。 增删改上报数据配置简单,并且一目了然 大量的数据处理.

SECS/GEM 6362

Java—继承与多态

目录 1、继承 1.1、继承的定义 1.2、继承的使用场景 1.3、构造器 1.4、protected关键字 1.5、谨慎继承 2、多态 2.1、多态的定义 2.2、多态的实现方式 2.2.1、基于继承实现的多态 2.2.2、基于接口实现的多态 1、继承 1.1、继承的定义 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大...

weixin_48112109的博客 5458

【论文+CAD图纸】光储充一体化微电网设计

近些年来,我国的经济发展迅速,对能源的需求不断增长,也加重了对环境的破坏,违背了我国的可持续发展战略。所以迫切需要寻找新型能源。由于太阳能在使用时不会产生污染,所以太阳能逐渐受到人们的重视。我国的太阳能资源丰富,具有的开发利用潜力。特别是近些年“光储充”一体化充电站为高科技绿色充电模式,“以光养桩”使光伏、储能、智能充电协同,智能微电网与公共电网互动,本设计对探索清洁可再生能源在民用场合的应用,有着重大的理论和工程价值。本文综述国内外相关光伏发电的成果和发展现状;

weixin_761237174的博客 925

使用OpenGL加载和显示DXF格式的3D模型文件编程

这样,我们就完成了使用OpenGL加载和显示DXF格式的3D模型文件的编程。通过实现加载函数和绘制回调函数,我们能够读取DXF文件的数据并使用OpenGL绘制出来。请注意,这只是一个简单的例子,仅涵盖了基本的加载和显示功能。在本文中,我们将探讨如何使用OpenGL编程加载和显示DXF(Drawing Exchange Format)格式的3D模型文件。DXF是一种通用的CAD(计算机辅助设计)文件格式,常用于存储和交换2D和3D图形数据。使用OpenGL加载和显示DXF格式的3D模型文件编程。

2301_79331421的博客 413

JAVA继承和多态详细讲解

面向对象编程的重要知识:继承和多态。通过类的继承机制,可以使用已有的类为基础派生出新类,无需编写重复的程序代码,很好地实现程序代码复用。多态是面向对象编程中继封装和继承之后的另一大特征,它具体是指同一个行为具有多个不同表现形式或形态的能力。使用多态机制,可以提高程序的抽象程度和简洁性,最大程度地降低类和程序模块间的耦合性,并提高程序的可扩展性和可维护性。从Java语言的底层逻辑上看,封装和继承是为实现多态做准备的。6.1 类的继承继承描述了类的所属关系,多个类通过继承可形成一个关系体系,进而在原有类的基础上

weixin_45536242的博客 3589

【企业智能体开发】优化模型成本、延迟与失败降级

小林的培训快开始时,服务台花很久“思考最优回答”,体验并不会更好。反过来,为了省钱而始终选最轻的模型,若连房间、连接方式和任务状态都识别不稳,后续错误检索和重复建单会造成更大代价。企业 Agent 的优化对象不是单次模型调用价格,而是任务在可接受时间内、安全地推进到正确结果的总成本。

Mr数据杨 893

java学习笔记15(方法重载、继承、多态、接口、控制台相关练习)

文章目录10.20学习内容...方法重载目的继承extends继承树多重继承?super阻止继承(final)向上转型protected多态覆写(override)多态调用被覆写方法阻止覆写(final)接口interfaceimplements一类多接口接口继承练习内容1.控制台输出练习2.树型结构及其遍历3.树型结构,选择性打印 10.20 学习内容 … java 中,... 表示该参数是一个可变长参数,表示这个位置可以传入任意个该类型的参数。简而言之,就是一个数组。 方法重载 在一个类中,我们可以定义

嘘嘘喵的博客 394

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java笔记(方法、封装、静态、继承、多态、构造方法、this)

Java笔记(方法、封装、静态、继承、多态、构造方法、this)

LLM | Agent | RAG | Java 2683

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java学习笔记

面向对象的思想是:面向对象的思想是万物皆为对象 ,既任何事物都能封装成对象 。类(设计图):是对象共同特征的描述对象:是真实存在的具体的东西在java中,必须先设计类,才能获得对象 如何得到类的对象(创建对象)类名 对象名(自定义名称) = new 类名();如何使用对象访问属性:对象名.成员变量访问行为:对象名.方法名(…)用来描述一类事物的类,专业叫:javabean类。 在以前,编写main方法中的类,叫做测试类。 封装 对象代表什么,就得封装对应的数据,并提供数据对应的行为通俗一点就是

XZY__one的博客 410

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java学习笔记6——面向对象

编译的时候会认为我们还是调用的person里面的方法,注意前面的virtual是虚拟的意思,调用我们这个虚的方法,编译时方法,也即是父类当中的方法,运行时会动态绑定创建的对象的方法。④ (超纲)子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。> 父类被重写的方法的返回值类型是引用数据类型(比如类),则子类重写的方法的返回值类型可以与被重写的方法的返回值。但是,如果出现子类重写了父类的方法或子父类中出现了同名的属性时,

qq_58956810的博客 1057

java 面向对象 学习笔记 20250331

如题。 不定期更新补充+修正。

2301_76277472的博客 338

JAVA学习笔记(九)2025.03.30

4、接口的多继承:(一个接口可以同时继承多个接口)3、抽象类的常见应用场景:(模板方法设计模式)二、final关键字:(修饰类/方法/变量)1、认识多态:(编译看左边,运行看右边)四、抽象类:(不能创建对象)

qq_53911368的博客 208

详解Java之继承与多态

详解Java之继承与多态。

. 1万+

java封装继承多态

java封装继承多态 面向对象 面向对象的三个特征: 封装(Encapsulation); 继承(Inheritance); 多态(Polymorphism)。 我的总结: 面向过程:强调的是具体的功能实现;(执行者) 面向对象:强调的是具备功能的对象。(管理者) 2、类 类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础,本部分将深入介绍类的相关知识。 类的概...

阿龙Growing的博客 2796

JAVA继承、接口、多态

先来张菜鸟教程上找到的图方便理解: 文章目录(一)继承1.概念:2.简单举例:3.继承的作用4.继承类型5.继承特性与相关使用规则6.Java 重写(Override)与重载(Overload)(1) 重写(2)重载(二) 接口1.定义:2.接口特性:3.接口与其它的比较(1)接口与类的比较(2)接口与抽象类的比较(3)接口与继承的比较4.接口的继承(三)多态1.定义:2.多态的优点:3.多态存...

洺润Star的博客 2441

继承和多态(JAVA)

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。由图可知,向下转型并不安全如下列代码Cat cat = new Cat("元宝",2);Dog dog = new Dog("小七", 1);// 向上转型// 向上转型// 程序可以通过编程,但运行时抛出异常---因为:animal实际指向的是狗。

HYY的博客 1105

java学习总结(五)继承、重载、重写、多态

this:代表当前类的对象 this.id=idsuper:代表父类对象this():调用当前类的构造方法super():调用父类构造方法。

weixin_63618344的博客 2052

【Java作业】继承与多态

一、实验名称 实验五 继承与多态 二、实验内容 1.假定根据学生的3门学位课程的分数决定其是否可以拿到学位,对于本科生,如果3门课程的平均分数超过60分即表示通过,而对于研究生,则需要平均超过80分才能够通过。根据上述要求,请完成以下Java类的设计: (1)设计一个基类Student描述学生的共同特征。 (2)设计一个描述本科生的类Undergraduate,该类继承并扩展Student类。 (3)设计一个描述研究生的类Graduate,该类继承并扩展Student类。 (4)设计一个测试类Student

风过孤屿,山海自成诗行。 5508

Java面向对象 - 封装、继承和多态

简介 面向对象的三个基本特征是:封装、继承和多态。 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类)。封装和继承的目的都是:代码重用。而多态则是为了实现另一个目的 —— 接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。 本实训主要学习面向对象三大基本特性:封装、继承和多态。 第1关:什么是封装,如何使用封装 任务描述 相关知识 什么是封装 封装的意义 编程要求 测试说明 任务描述 本关任务:构造

aiains的博客 7052
下一篇: socket学习
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值