java多态用法

article/2025/9/12 23:00:01

目录

1.前提

2.优势与弊端

3.编译与运行

4.向上转型与向下转型

5.instance用法


要注意的是,本文章仅涉及多态中的用法讲述,不涉及基础概念(例如:什么是多态,基本概念是什么),那么,开始今天的主题。

1.前提

继承与重写。

2.优势与弊端

优势:方法中,使用父类型作为参数,可以接收所有子类对象

弊端:不能使用子类特有方法

以代码为例:

public class TestDemo1 {public static void main(String[] args) {Scanner in = new Scanner(System.in);Fu fu  = new Zi();System.out.println(fu.name);//输出张三fu.show();//输出我是李四fu.play();//非法,由于paly是子类特有方法,因此编译会报错}
}class Fu{String name = "张三";public void show(){System.out.println("我是张三");}
}class Zi extends Fu{String name = "李四";@Overridepublic void show(){System.out.println("我是李四");}public void play(){System.out.println("王者农药");}
}

3.编译与运行

在多态中,遵循这样一个规则:

调用成员变量时:编译看左边,运行也看左边

调用成员方法时:编译看左边,运行看右边

这里代码部分还以上述为例:

System.out.println(fu.name);//张三

 首先,name是成员变量,那么遵循编译看左边,运行也看左边的原则。

编译时要看左边的父类中有没有name这个变量,如果有的话,编译通过,运行时则调用子类的name。

如果父类中没有name,则会报错。

运行时,可以这样理解:

对象是谁就调用谁的变量,对象为fu,所以调用fu的name,就是张三。

fu.show();//我是李四

show是成员方法 ,那么遵循编译看左边,运行看右边的原则。

编译时与上述同理

运行时,可以这样理解:

既然发生了重写,那么在虚方法表中子类的方法会覆盖掉父类的方法,所以调用方法时调用的是子类的show,输出我是李四。

4.向上转型与向下转型

 这里由于向上转型就是创建多态,因此不着重讲解

1.向上转型

Fu fu = new Zi();

// 父类型   父类对象   =   new   子类型();

这里的fu,只能调用fu与zi中共有的变量,方法。具体如何调用,上述已经讲解。

着重看向下转型

2.向下转型      

可以理解为强制类型转换

先以一个代码为例:

        int a = 10;double b = 20.0;double c = b+a;System.out.println(c);//30.0int d = a+(int) b;System.out.println(d);//30

为什么要举这个例子呢?我们都知道由低精度转到高精度,可以自动转换。而从高精度转向低精度,则需要强制类型转化。我认为,向上转型与向下转型可以按照这种方法来理解记忆。

先看向下转型的代码:

        Fu fu = new Zi();Zi zi = (Zi) fu;zi.play();//王者农药

可以理解为,fu是父类对象,zi为子类对象,若想将父类对象赋给子类对象,就必须通过强制类型转换才可。zi可以调用子类所特有的方法,变量。

还可粗暴点理解,直接将向下转型这一步理解成创建子类对象即可。

要注意的是:

向下转型并不是随意转型,例如:

class Fu{String name = "张三";public void show(){System.out.println("我是张三");}
}class Zi1 extends Fu{String name = "李四";@Overridepublic void show(){System.out.println("我是李四");}public void play(){System.out.println("王者农药");}
}class Zi2 extends Fu{String name = "王五";@Overridepublic void show(){System.out.println("我是王五");}public void play(){System.out.println("吃鸡");}
}public class TestDemo1 {public static void main(String[] args) {Scanner in = new Scanner(System.in);Fu fu = new Zi1();Zi1 zi1 = (Zi1) fu;zi1.play();//王者农药Zi2 zi2 = (Zi1) fu;//会报错,无法转型}
}

为何 Zi2 zi2 = (Zi1) fu; 这一步会报错呢?

因为转换的类型与真实类型不同,所以会报错。

而怎么知道自己转换是否正确呢,那么就要用到instance关键字了。

5.instance用法

instance关键字可用于判断类型转化是否有误

先看代码:

​
​
class Person{String name;int age;
}
class Student extends Person{public void study(){System.out.println("学生在学习");}
}class Teacher extends Person{public void teach(){System.out.println("老师在教书");}
}public class TestDemo1 {public static void main(String[] args) {Scanner in = new Scanner(System.in);Person person = new Student();if(person instanceof Student ){Student student = (Student) person;student.study();} else if (person instanceof Teacher) {Teacher teacher = (Teacher) person;teacher.teach();}//输出结果为:学生在学习Person person1 = new Teacher();if(person1 instanceof Student ){Student student = (Student) person1;student.study();} else if (person1 instanceof Teacher) {Teacher teacher = (Teacher) person1;teacher.teach();}//输出结果慰:老师在教书}
}​​

instance用于判断person以及person1的类型,并在if语句中进行向下转型调用Teacher以及           Student的特有方法。

而像其中先判断类型再创建对象这一步骤比较繁琐,可以进行精简

        Person person = new Student();if(person instanceof Student ){Student student = (Student) person;student.study();}//可精简为if(person instanceof Student student){student.study();}//这一步是在进行判断的同时,如果类型匹配,便直接创建对象

         关于向下转型的总结:

        1.向下转型可以变为真正的子类类型,从而调用子类特有的方法

        2.转化类型与真实类型不一样会报错

        3.转化时用instance关键字判断


http://chatgpt.dhexx.cn/article/LdsPoubW.shtml

相关文章

Java多态详解(入门可看)

一、概念 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式。多态 机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作&a…

Java多态类

Java多态类 一、多态概述二、多态性形势下的类型转换问题三.多态类综合案例 一、多态概述 1、什么是多态? 同类型的对象,执行同一个任务,会表现出不同的行为特征。 2、多态的常见形式 父类类型 对象名称 new 子类构造器 接口 对象名称 ne…

java多态的理解

目录 一、多态的定义:二:多态的好处:三、实现多态的三个条件(前提条件,向上转型、向下转型):四、多态使用:虚拟方法调用深入分析多态: 向下转型instanceof关键字的使用经…

解析java多态经典习题

解析java多态经典习题 1 题目一 1.1 题目内容 编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从 而发出不同的声音。 可以弹奏的乐器包括二胡、钢琴和琵琶。 实现思路及关键代码: ①定义乐器类Instrument,包括方法makeSound() ②定义乐器类的子类…

java多态(java多态的概念)

简述什么是JAVA中的多态 父类的引用可以引用子类的对象。换句话说,如果有一个类继承或实现了某个类或接口,那么被继承或实现的类或接口可以创建那一个类的对象,这样程序就会变得很灵活。 java中多态的定义是什么? 多态性是指允许不…

彻底搞懂Java多态

很多初学者在自学Java时候都卡在了Java多态,本教程从实际案例出发阐述Java多态现象及Java多态的原理。 通过案例理解多态的现象 需求描述 多态是类在继承关系下的一种形态,下边先通过一个需求展示下多态的现象。 攀博课堂是一个在线教育学习平台&…

java多态实现原理

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持到底是如何实现的呢&#xff0…

新手小白学JAVA 面向对象之多态

多态 1. 概念 多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。 可以把不同的子类对象都当作父…

html表单实例:用户反馈表单页面代码

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>demo</title> </head> <body><h1 align"center">用户反馈表单</h1><form method"post"><…

html 下拉多选框代码,js实现下拉复选框效果(代码实例)

本章给大家带来用js实现下拉复选框效果(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 先看看效果: 下面我们看看代码: HTML代码: HTMLCSSJavaScriptjQueryPHPMySQLJavaC#C++Pyhtoncss代码:div {display: inline-block; } select {min-width…

HTML实例--制作表单

运用表格和表单基础知识简单制作一个表单 表单制作使用表格来对表单进行排版美化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

Html5 Canvas绘图实例

前些年的时候&#xff0c;突然对Canvas感兴趣&#xff0c;利用空闲时间做一些Canvas小例子进行练习&#xff0c;仅供学习分享使用。如有不足之处&#xff0c;还请指正。 什么是 Canvas&#xff1f; HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域…

用html做个随机点名系统代码,html座位表随机点名的实例代码

这篇文章详解html座位表随机点名的实例代码点名 td { width: 9.09%; height: 50px; text-align: center; } .tdBg { background-color: pink; } var timer null; // 这是一个函数&#xff0c;表示一个功能 function start(){ timer setInterval(function(){ // alert("要…

在html中如何写日期的代码,日期html代码

日期 时间 星期的html代码是什么代码 创建静态方法findDate,返回List类型。 声明一个List list集合,向List集合存储英文星期。 调用findDate静态方法,并打印List集合存储结果。 CSS布局HTML小编今天和大家分享一个显示当前系统日期的HTML代码 显示的格式为“某年某月某日”,…

html向上移动图片代码,图片随网页上下移动的代码实例

我们以腾讯QQ网页在线客服为例,大家将代码拷到DW中,用心体会。图片随网页上下移动的代码实例 function picsize(obj,MaxWidth){img=new Image(); img.src="/obj.src"; if (img.width>MaxWidth) {return MaxWidth; } else {return img.width; } } function Close…

html5 简单实例源代码

实例教程&#xff1a;http://www.w3school.com.cn/jquery/ 源代码下载&#xff1a; http://download.csdn.net/detail/wyx100/9827067 html5文件布局结构 html5文件布局结构html5语言标记 浏览器执行效果 html5文件源代码 源代码下载&#xff1a; http://download.csdn.net/de…

html实例,实现表单

1.使用HTML完成下列功能 <!doctype html> <html><head><!-- <meta charset"GBK">--></head><body><table width"60%" border"3" align"center" bgcolor"#F0F8FF" borderColor…

html导航栏纵向代码,html横向导航栏怎么做?横向导航条代码实例

有不少小伙伴在刚学习 html 的时候都会遇到这样一个问题&#xff1a;html 横向导航栏怎么做&#xff1f;今天W3Cschool小编就为大家分享一下简单的横向导航条代码&#xff0c;相信会对大家有所帮助。 html 横向导航栏一般用两种方法来制作&#xff1a;第一种&#xff0c;我们使…

html如何插入下拉菜單,html下拉菜单怎么做?html下拉菜单的代码实例介绍

本篇文章主要的介绍了关于HTML select标签下拉菜单的做法实例&#xff0c;还有一个html的一些网站的下拉菜单的用法都放在了文章中&#xff0c;下面就让我们一起来看看这篇文章吧 首先我们要知道html下拉菜单的代码是什么&#xff1f; 很明显是select元素可创建单选或多选菜单。…

HTML代码示例和介绍

HTML基本的格式 <!DOCTYPE html> <!-- 声明文档。定义html --> <html lang"en"> <!-- 元素是页面的根元素 --> <head> <!-- 元素包含文档的元数据 --><meta charset"UTF-8"&g…