JavaSE学习笔记_5:Java多态

Java从入门到架构师__JavaSE Java语言基础 阅读详情

Java多态

 

一、多态(面向对象的第三个特征)

1、多态—概念

多态:可以理解为事物存在的多种体现形式。

人:男人,女人

动物:猫,狗

猫 x=new 猫();

动物 x=new 动物();//实体x既具备猫的类型也具备动物的类型。

 

多态的前提:必须是类与类之间有关系。要么继承,要么实现。

多态的体现:父类引用指向子类对象。父类引用也可以接收子类对象。

多态的好处:大大的提高程序的扩展性和代码的复用性。

多态的弊端:只能使用父类的引用去访问被子类复写的父类功能。可以转型。(创建对象时是向上转型,如:Animal a=new Cat(),想调用子类中特有的功能向下转型(强转),如:Cat c=(Cat)a)

 

2、多态—扩展性

3、多态—转型

 

用实例来讲解:

/*

动物

猫,狗

*/

一开始:

abstract class Animal

{

public abstract void eat();//吃啥不确定,每个动物 //的事物都不一样。

}

 

//定义子类

class Cat extends Animal

{

//由子类来实现未知的内容

public void eat()

{

System.out.println(“吃鱼”);

}

//子类自己独有的功能

public void catMouse()

{

System.out.println(“抓老鼠”);

}

}

 

class Dog extends Animal

{

public void eat()

{

System.ou.println(“吃骨头”);

}

public void kangjia()

{

System.out.println(“看家”);

}

}

 

class Pig extends Animal

{

public void eat()

{

System.ou.println(“吃饲料”);

}

public void gongdi()

{

System.out.println(“拱地”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

Cat c=new Cat();

c.eat();

Cat c2=new Cat();

c2.eat();

 

Dog d=new Dog();

d.eat();

Dog d1=new Dog();

d1.eat();

 

Pig p=new Pig();

p.eat();

Pig p1=new Pig();

p1.eat();

}

}

发现以上主函数中的代码好死板,我们可以:

abstract class Animal

{

public abstract void eat();//吃啥不确定,每个动物 //的事物都不一样。

}

 

//定义子类

class Cat extends Animal

{

//由子类来实现未知的内容

public void eat()

{

System.out.println(“吃鱼”);

}

//子类自己独有的功能

public void catMouse()

{

System.out.println(“抓老鼠”);

}

}

 

class Dog extends Animal

{

public void eat()

{

System.ou.println(“吃骨头”);

}

public void kangjia()

{

System.out.println(“看家”);

}

}

 

class Pig extends Animal

{

public void eat()

{

System.ou.println(“吃饲料”);

}

public void gongdi()

{

System.out.println(“拱地”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

function(new Cat());

function(new Cat());

 

function(new Dog());

function(new Dog());

 

function(new Pig());

function(new Pig());

}

pubic static void function(Cat c)

{

c.eat();

}

pubic static void function(Dog d)

{

d.eat();

}

pubic static void function(Pig c)

{

p.eat();

}

}

发现这样的话,如果再来一个动物鸡,那么主类中还需写一个function()以重载形式出现。动物越多,function()重载越多。因此另辟蹊径:

abstract class Animal

{

public abstract void eat();//吃啥不确定,每个动物 //的事物都不一样。

}

 

//定义子类

class Cat extends Animal

{

//由子类来实现未知的内容

public void eat()

{

System.out.println(“吃鱼”);

}

//子类自己独有的功能

public void catMouse()

{

System.out.println(“抓老鼠”);

}

}

 

class Dog extends Animal

{

public void eat()

{

System.ou.println(“吃骨头”);

}

public void kangjia()

{

System.out.println(“看家”);

}

}

 

class Pig extends Animal

{

public void eat()

{

System.ou.println(“吃饲料”);

}

public void gongdi()

{

System.out.println(“拱地”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

function(new Cat());

function(new Cat());

 

function(new Dog());

function(new Dog());

 

function(new Pig());

function(new Pig());

}

pubic static void function(Animal a)

{

c.eat();

}

}

但是,这样虽好,却只能调用子类中重写的方法。因此可以向下转型:

abstract class Animal

{

public abstract void eat();//吃啥不确定,每个动物 //的事物都不一样。

}

 

//定义子类

class Cat extends Animal

{

//由子类来实现未知的内容

public void eat()

{

System.out.println(“吃鱼”);

}

//子类自己独有的功能

public void catMouse()

{

System.out.println(“抓老鼠”);

}

}

 

class Dog extends Animal

{

public void eat()

{

System.ou.println(“吃骨头”);

}

public void kangjia()

{

System.out.println(“看家”);

}

}

 

class Pig extends Animal

{

public void eat()

{

System.ou.println(“吃饲料”);

}

public void gongdi()

{

System.out.println(“拱地”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

function(new Cat());

function(new Cat());

 

function(new Dog());

function(new Dog());

 

function(new Pig());

function(new Pig());

}

pubic static void function(Animal a)

{

a.eat();

Cat c=(cat)a;

c.catchMouse();//调用了子类自己特有的内容。

}

}

但是,如果传入的是new Dog(),则编译通过,运行失败,发生类型转化异常:ClassCastException。则:

abstract class Animal

{

public abstract void eat();//吃啥不确定,每个动物 //的事物都不一样。

}

 

//定义子类

class Cat extends Animal

{

//由子类来实现未知的内容

public void eat()

{

System.out.println(“吃鱼”);

}

//子类自己独有的功能

public void catMouse()

{

System.out.println(“抓老鼠”);

}

}

 

class Dog extends Animal

{

public void eat()

{

System.ou.println(“吃骨头”);

}

public void kangjia()

{

System.out.println(“看家”);

}

}

 

class Pig extends Animal

{

public void eat()

{

System.ou.println(“吃饲料”);

}

public void gongdi()

{

System.out.println(“拱地”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

function(new Cat());

function(new Cat());

 

function(new Dog());

function(new Dog());

 

function(new Pig());

function(new Pig());

}

pubic static void function(Animal a)

{

b.eat();

if(a instanceof Cat)

{

Cat c=(Cat)a;

a.catchMouse();

}

else if(a instanceof Dog)

{

Dog d=(Dog)a;

d.kangjia();

}

else if(a instanceof Pig)

{

Pig p=(Pig)a;

p.gongDi();

}

}

}

上述代码,如果动物越多,判断也就越多,也不是好办法。待留。还有就是不建议在function()中首先对Animal类型做判断,因为无论如何也都成立。

 

还有就是,将function()单独放在一个类中,这个类与Animal类共同成为一个体系。

4、多态中成员的特点

Fu f=new Zi();(Fu可以是一个类,也可以是一个接口)

(1)在多态中成员函数的特点

1)在编译时期,参阅引用型变量所属的类是否有调用的方法。如果有,编译通过;如果没有,编译失败。

2)在运行时期,参阅对象所属的类中是否有调用的方法。如果有,运行通过;如果没有,运行失败。

简单总结:编译看左边,运行看右边。

(2)在多态中成员变量的特点

无论编译和运行,都参考左边(引用型变量所属的类)

(3)在多态中静态成员变量的特点

无论编译和运行,都参考左边(引用型变量所属的类)

(4)在多态中静态成员函数的特点

无论编译和运行,都参考左边(引用型变量所属的类)

 

示例1:

/*电脑主板*/

//功能单一的主板逐渐增添多个功能。

 

一开始

class MainBoard

{

public void run()

{

System.out.println(“mainboard run”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

MainBoard mb=new MainBoard();

mb.run();

}

}

主板功能太单一。现在想上网,买来网卡

class MainBoard

{

public void run()

{

System.out.println(“mainboard run”);

}

public void useNetCard(netCard c)

{

c.open();

c.close();

}

}

//定义网卡

class NetCard

{

public void open()

{

System.out.println(“netcard open”);

}

public void close()

{

System.out.println(“netcard close”);

}

}

class DuoTaiDemo

{

public static void main(String[] args)

{

MainBoard mb=new MainBoard();

mb.run();

mb.useNetcard(new NetCard());

}

}

现在又想听音乐,又买来一个声卡,则还得修改主板,耦合性强。发现主板毫无扩展性可言。现在利用多态的思想:

interface PCI

{

Public abstract void open();

Public abstract void close();

}

class MainBoard

{

public void run()

{

System.out.println(“mainboard run”);

}

public void usePCI(PCI   p)

{

  if(p!==null)

{

p.open();

p.close();

}

}

}

//定义网卡

class NetCard implements PCI

{

public void open()

{

System.out.println(“netcard open”);

}

public void close()

{

System.out.println(“netcard close”);

}

}

 

//定义声卡

class SoundCard implements PCI

{

public void open()

{

System.out.println(“Soundcard open”);

}

public void close()

{

System.out.println(“Soundcard close”);

}

}

 

class DuoTaiDemo

{

public static void main(String[] args)

{

MainBoard mb=new MainBoard();

mb.run();

mb.usePCI(new NetCard());

mb.usePCI(new SoundCard());

}

}

 

实例2:

/*

数据库的操作:

1、连接数据库。JDBC、Hibernate两种方式

2、操作数据库。c:creat r:read u:update d:delete

3、关闭数据库。

*/

 

一开始:我们用jdbc的方式连接数据库:

class UserInfoByJDBC

{

public void add(User user)

{

1、JDBC连接数据库。

2、使用sql添加语句添加数据。

3、关闭数据库。

}

public void delete(User user)

{

1.JDBC连接数据库。

2.使用sql删除语句删除数据。

3.关闭数据库。

}

}

class DBOperate

{

public static void main(String[] args)

{

UserInfoByJDBC ui=new UserInfoByJDBC();

ui.add(user);

ui.add(user);

}

}

后来,我们又想通过Hibernate方式连接。则:

class UserInfoHibernate

{

public void add(User user)

{

4、Hibernate连接数据库。

5、使用sql添加语句添加数据。

6、关闭数据库。

}

public void delete(User user)

{

4.Hibernate连接数据库。

5.使用sql删除语句删除数据。

6.关闭数据库。

}

}

class DBOperate

{

public static void main(String[] args)

{

UserInfoByHibernate ui=new 

            UserInfoByHibernate();

ui.add(user);

ui.add(user);

}

}

发现连接方式和主程序的耦合性非常强。因此利用多态的思想:

interface UserInfoDao

{

public void add();

public void delete();

}

class UserInfoByJDBC implements UserInfoDao

{

public void add(User user)

{

7、JDBC连接数据库。

8、使用sql添加语句添加数据。

9、关闭数据库。

}

public void delete(User user)

{

7.JDBC连接数据库。

8.使用sql删除语句删除数据。

9.关闭数据库。

}

}

Class UserInfoByHibernate implements UserInfoDao

{

public void add(User user)

{

10、Hibernate连接数据库。

11、使用sql添加语句添加数据。

12、关闭数据库。

}

public void delete(User user)

{

10.Hibernate连接数据库。

11.使用sql删除语句删除数据。

12.关闭数据库。

}

}

class DBOperate

{

Public static void main(String[] args)

{

UserInfoDao ui=new UserInfoByJDBC()/

UserInfoByHibernate();

ui.add(user);

ui.delete(user);

}

}

这样,主程序只和interface有关系,与UserInfoByJDBC/UserInfoByHibernate无关。当主程序中还有一个地方需要改,想让它也不用改,则涉及到以后的反射。

 


2015-11-20至2015-11-20著

SSTI模板注入及绕过姿势(基于Python-Jinja2) http://xmctf.top:8962/?name={{%22%22[%22\x5f\x5fclass\x5f\x5f%22]["\x5F\x5Fbase\x5F\x5F"]["\x5F\x5Fsubclasses\x5F\x5F"]()[233]["\x5F\x5Finit\x5F\x5F"]["\x5F\x5Fglobals\x5F\x5F"]["\x5F\x5Fbuiltins\x5F\x5F"]['eval']("\x5F\x5Fimport\x5F\x5F('os'))")}} 阅读详情

相关推荐

别再手动算考勤了!教你用Python+企业微信API自动生成月度报表

本文介绍如何利用Python和企业微信API构建自动化考勤分析系统,实现从数据获取到可视化报表生成的全流程自动化。通过企业微信打卡接口获取数据,使用Pandas进行高效清洗和分析,并生成Excel和HTML格式的报表,大幅提升考勤统计效率。系统支持智能判定考勤状态,如迟到、早退等,并可通过定时任务实现月度自动化运行。

weixin_27875131的博客 289

02.面向对象

面向过程是一种编程思想,它强调的是过程,意思是我们做任何事,都需要亲力亲为。 面向对象也是一种编程思想,相对于面向过程,我们的身份可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化。 面向对象的三大特征: 1.封装:把相关的数据封装成一个"类"组件 2.继承:是子类自动共享父类属性和方法,这是类之间的一种关系 3.多态:增强软件的灵活性和重用性 package cn.tedu.oop; /*本类用作面向对象OOP入门案例 * 设计手机这一类事物 * 分析属性:品牌 价格 尺寸 颜色 *

guan_xfeng的博客 535

Revit获取族预览图

最近做到和族库相关的功能需要获取到族文件的预览图,在RevitAPI中提供了ElementType.GetPreviewImage方法,但是前提就是你是在Revit里面操作的,并且已经拿到了Symbol对象实例,才可以调用此方法。然后在网上找了另外一种方式,通过读取Revit文件,在REVITPREVIEW4.0字段截取文件信息,将其转换为图片格式。 一、使用RevitAPI中ElementType.GetPreviewImage方法 [Autodesk.Revit.Attributes.Transac.

weixin_44631419的博客 1754

【JavaSE】JavaSE之继承和多态

深入浅出了解继承和多态,图文并茂让你没齿难忘QWQ~~

bit me的博客 1214

485芯片AB波形正负半周的问题探讨

      本人做的一个产品,产品的其中一个接口是RS485的,我们使用的芯片是MAX13487E。MCU是STM32F103,MCU的USART通过光耦隔离后,接到MAX13487E。因为STM32F103的VCC是3.3V的,MAX13487E的VCC是5V。      部分原理图如下,上述部分电路参考了官方的参考设计,现在测试的AB波形时候发现如下问题。1.把R10和R16改为1k,示波器C...

qq_26308521的博客 1万+

cesium 实现经纬线绘制和经纬度标注

废话不对数直接上线效果图及代码 1.效果图 2.实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=

一碗老面的博客 2569

【JavaSE】你不知道的多态:多态数组与多态参数

本文通过有趣的案例带你了解什么是多态数组,什么是多态参数,并对 instanceof关键字的用法进行了总结。

黄小黄的博客 1270

【四足机器人实战】四足机器人运动学、动力学模型

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!四足机器人的运动学和动力学模型是其设计和控制的基础,涉及到如何精确描述和预测机器人在不同条件下的运动状态和行为本文先对四足机器人运动学、动力学模型做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章运动学模型主要关注四足机器人的几何形态和时间序列下的运动特性,而动力学模型则进一步考虑了引起这些运动的力和扭矩的作用效果。运动学模型:运动学模型描述了四足机器人在没有考虑力的影响下的运动特性。

qq_35635374的博客 1055

JavaSE学习笔记第二弹——对象和多态(下)

JavaSE学习笔记第二弹之数组、封装、继承、多态、抽象类、接口。

PleaSure乐事的博客 1126

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

把 sy-* 带进 ABAP CDS:ABAP 7.50 里的环境信息新姿势($session 与 @Environment.systemField 实战)

摘要:ABAP 7.50在CDS视图中引入两种获取环境信息的方式:1)直接使用$session会话变量读取用户、客户端和系统语言;2)通过@Environment.systemField注解参数,由Open SQL自动注入系统字段。$session方式简单但依赖Open SQL访问路径,非ABAP环境下可能失效;注解参数方案更工程化,依赖关系明确且支持测试。建议ABAP体系内优先使用$session,对外接口采用参数化方案。两种方式各有适用场景,正确选择可避免潜在风险。(148字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 152

【JAVA |总结】JAVASE基础大总结(含思维导图)

我们已经系统的发布了详细的JAVASE的每一个单独知识点的文章,在这里做一个总结,详细请看跳转到对应文章!!!!传送门1.【JAVA |开篇】JAVA入门及JDK环境配置-优快云博客2.【JAVA |数据类型】数据类型、类型提升、类型转换-优快云博客3.【JAVA |基础】运算符、程序逻辑控制以及方法的使用-优快云博客4.【JAVA |数组】数组定义与使用、常见的Arrays类介绍_java的arrays-优快云博客。

YKX0000的博客 1628

2024 全国大学生新质生产力大赛 B:金融违规交易的大数据分析 问题四思路代码

问题四:请分析附件中所有的指标数据,选取合适的指标,建立“金融违规 洗钱交易的预测模型”,并选取合适的训练集和测试集,计算预测模型的准确率。 为了提前识别并预测金融违规洗钱的交易事件,请基于你们团队数据分析的结果, 分别给公安部门和银行机构提出你们的建议。

YOLO 375

JavaSE——继承和多态详解

5000字详解继承和多态

chenchenchencl的博客 1065

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...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【JavaSE】继承和多态

关于JavaSE中继承和多态的学习~

qq_56251766的博客 726

精雕软件(JDpaint) 5.5 绿色版

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

(java学习笔记)JavaSE基础

Java技术体系平台 JavaSE :标准版 面向桌面型应用(Windows下的应用程序)的Java平台。提供完整的Java核心API,也叫J2SE. JavaEE:企业版 开发企业环境下的应用程序。该技术体系中包含的技术 Servlet Jsp。主要针对Web应用程序开发。也叫J2EE. JavaME:小型版 支持Java程序运行在移动终端(手机、PDA:掌上电脑 条码扫描器、RFID读写器、P...

陌然白(小白)的博客 4057

JavaSE:继承和多态(下篇)

大家好,前几天蜡笔小欣带大家了解并学习了Java中的继承,子类通过extends关键字来继承父类。通过继承,子类可以重写父类的方法,从而实现多态性。今天我们就一起去认识Java中的多态,了解多态的概念,掌握多态的用法,使我们在写程序时更加方便。二、多态多态是面向对象的一个关键概念,它允许对象以不同的方式表现,具体取决于它们的类型。在 Java中,多态通过继承和方法重写来实现,让我们能够编写灵活、可扩展且可维护的代码。!!

m0_74336101的博客 3619

JavaSE面试题——5.面向对象的三大特征:封装、继承、多态

封装: 封装的目的是隐藏对象内部的实现细节,以提高安全性和简化编程。 指把一个对象的属性隐藏在对象内部,不允许对象外部直接访问对象内部的数据,只能通过可以被外界访问的方法来操作这些属性 继承: 继承是代码复用的一种机制,以已存在的类为基础建立新类的技术,新类被称为子类,已存在的类被称为父类,子类自动继承父类的非私有的属性和方法,从而达到代码复用的效果 JAVA中只支持单继承,不支持多继承 多态: 顾名思义,多态表示一个对象具有多种形态,具体表现为父类的引用指向子类对象,使程序的拓展性更强,提高了系统的灵活性

出发,永远是最有意义的事,去做就是了 4851

【JAVASE】多态

⭐ 作者:小胡_不糊涂。

iLoyo_的博客 709

JavaSE--多态

javase中多态的详细介绍

x2656271356的博客 216

JavaSE-多态

在完成某个行为时,不同的对象在完成时会呈现出不同的状态。比如:动物都会吃饭,而猫和狗都是动物,猫在完成吃饭行为时吃猫粮,狗在完成吃饭行为时吃狗粮,猫和狗都会叫,狗在完成这个行为时会狗叫,而哈基米会哈气。在编程中,多态是指利用子类继承父类的特性在使用对象时达到简化代码的目的。

2401_85870305的博客 895

JavaSE 多态

JavaSE 多态详解

Mwt258的博客 165

JavaSE 继承和多态

子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分。父子父子肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。直接访问是无法做到的,Java提供了。

A1546553960的博客 815

JavaSE继承和多态

并在子类构造方法中选择合适的父类构造方法调用,否则编译失败在子类构造方法中,super(…)调用父类构造时,必须是子类构造函数中第一条语句super(…)只能在子类构造方法中出现一次,并且不能和this同时出现。

~ 813

JavaSE——继承和多态

继承,多态

xh1605004242的博客 1076

【JavaSE系列】Java面向对象之组合多态与接口

本篇文章带大家认识Java基础知识——组合,多态与接口,小伙伴们,好久不见,上篇博文《包与继承》留给读者的题选A。这篇文章将会详细介绍多态与接口,上次介绍的继承是阅读本文的基础,先来复盘一下继承吧,继承就相当于多张图纸实例一个对象,我们不妨将图纸分为两类,一类具有共性,另一类具有特性,则具有共性的图纸(类)称为父类(基类,超类),具有特性的图纸(类)称为子类,两者的关系是子类继承父类。

未见花闻的博客 2034

初识java———javaSE(5)继承与多态【求个关注!】

继承的思想:所谓继承在生活中有继承衣钵,继承遗产的说法,java中引入了继承的思想,继承是类与类之前的关系,一个类继承另一个类的成员与方法被继承的类称为父类 /基类 / 超类继承的类成为 子类/派生类子类可以使用父类的成员变量与方法,也可以定义自己的成员变量与方法!dog1.name = "小黑";int age;System.out.println("动物发出叫声!");String sex;System.out.println("狗在吃骨头!");

2301_77993957的博客 1399
上一篇: JavaSE学习笔记_4:Java继承
下一篇: JavaSE学习笔记_7:Java内部类
java_程序媛
博客等级 码龄11年 26粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值