Java中的多态如何理解,你了解多少?
xsobi 2025-01-03 19:37 1 浏览
概念
本篇文章我们主要讲解的是Java中的多态,那么什么是多态呢?同类型的对象,执行同一个行为,会表现出不同的行为特征。接下来让我们一起对多态进行详细地讲解。
多态的常见形式:
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
//父类:
public class People {
public String name ="人";
void run(){
}
}
//子类1:
public class Student extends People{
public String name = "小学生";
@Override
void run() {
System.out.println("小学生跑的慢");
}
}
//子类2:
public class Teacher extends People{
public String name = "老师";
@Override
void run() {
System.out.println("老师跑的快");
}
}
//main方法:
public static void main(String[] args) {
People a1 = new Student();
People a2 = new Teacher();
a1.run();
a2.run();
System.out.println(a1.name);
System.out.println(a2.name);
}
//输出结果:
//小学生跑的慢
//老师跑的快
//人
//人
多态中成员访问特点:
- 方法调用:编译看左,运行看右;
在编译的时候,先访问“People a1 = new Student();”的左边“People父类”中的方法,而在运行的时候,会访问右边“Student子类”中的方法;
- 变量调用:编译看左,运行也看左。(多态注重行为多态)
在编译的时候,会访问“People a1 = new Student();”的左边“People父类”中的变量,并且在运行的时候,仍然访问左边“People父类”中的变量。
多态的优点
- 在多态形式下,右边对象可以解耦合,便于扩展和维护
People a = new Student();
People a = new Teacher();
a.run();//后续业务行为随对象而变,后续代码无需更改
- 定义方法的时候,使用父类型作为参数,该方法就可以接收这一父类的一切子类对象,体现出多态的扩展性与便利
//此时在父类People中添加一个PK()方法,其中的形参设置为“People a”要优于“Student a”,
//为什么呢?第一种可以接收该父类的一切子类对象,而第二种只能接收一种,具有局限性
Public void PK(People a){
System.out.println("参加比赛了!");
a.run();
}
多态的缺点
- 多态下不能使用子类的独有功能
//倘若在其子类Student中添加独有的方法sick()
public class Student extends People{
void sick(){
}
}
//main方法
People p = new Student();
p.run();// √
p.sick();// ×
类型转换
既然前面说到“多态下不能使用子类的独有功能”,那么该由谁来调用呢?子类独有功能当然还是由子类自己来调用,此时我们就需要引入类型转换的概念: 类型转换分为两种,分别是:“自动类型转换、强制类型转换”。
自动类型转换:
People s = new Student();
s.run();
强制类型转换:
由于在实例化对象的时候,s属于父类类型,因此要将s强制类型转化为子类类型才可以调用子类独有的方法。
子类 对象变量 = (子类)父类类型变量
People s1 = new Student();
//s1.sick(); ×
Student s2 = (Student)s1;
s2.sick();// √
tips:如果转型后的类型和对象真实类型不是同一种类型的话,那么在转换的时候就会出现ClassCastException(类型转换异常)
People s = new Student();
Teacher t = (Teacher) s;
//强制类型转换,编译阶段不会报错(有继承和实现关系的可以强制转换),运行时会报错
不过Java为了避免这种情况的发生,推荐使用instanceof去检查类型是否正确
用法:a instanceof b,若a和b的类型相同,则输出true,反之则输出false
People p = new Student();
if (p instanceof Student){
Student s = (Student) p;
}else(p instanceof Teacher){
Teacher t = (Teacher) p;
}
相关推荐
- 听说你还不知道Java代码是怎么运行的?
-
作者:Jay_huaxiao前言作为一名Java程序员,我们需要知道Java代码是怎么运行的。最近复习了深入理解Java虚拟机这本书,做了一下笔记,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激...
- 如何开始学习JAVA编程?
-
#记录我的9月生活#...
- java后端开发需要学什么?
-
Java属于后端开发中最常见的语言之一,Java这种语言的体系比较中立,而且具备了构建多线程的能力,在许多大型互联网平台Java的应用范围特别广泛。 java后端主要涉及到如下4个技术: 第一、S...
- 细思极恐:你真的会写Java吗?
-
导语自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个java程序员,那你真的会写java吗?...
- 七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得
-
前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...
- 我把Java基础编程及思维导图整理的超级详细,小白都能看懂
-
Java基础编程及其思维导图目录:Java学习导图一、Java基本语法1.关键字与标识符2.变量分类3.运算符4.流程控制二、数组1.数组概述2.一维数组3.二维数组4.数组常见算法5....
- Java 开发中的 9 个实用技巧:案例详解
-
Java开发中,总有一些技巧能够帮助我们提高代码质量和开发效率。下面,我们来分享9个Java技巧,每个技巧都附上实际案例,帮助你在工作中立刻应用。1.合理使用final关键字...
- Java 20年,以后将往哪儿走?
-
在今年的Java20周年的庆祝大会中,JavaOne2015的中心议题是“Java的20年”。甲骨文公司Java平台软件开发部的副总裁GeorgesSaab的主题演讲就将关注点放在了java...
- 推荐1个java快速开发项目,让你接私活不用愁
-
??大家好,我是小编南风吹,每天推荐一个小工具/源码,装满你的收藏夹,让你轻松节省开发效率,实现不加班不熬夜不掉头发!...
- 教你用Java开发一个简单的JVM
-
一、前言几年前,接到一个开发任务:用Java开发能运行Java智能合约的虚拟机。在开发Java智能合约时,只能使用智能合约SDK提供的类和一些Java常用类(8种基本数据类型包装类;String、Bi...
- java实战教程(一)软件开发流程&开发模式
-
这里小编为了方便处于不同学习阶段的童鞋,准备了三个系列的文章,java系列教程、java实战教程、java进阶教程,对于刚入坑的童鞋,可以先按照这三个系列教程一步步的了解,循序渐进,java实战系列教...
- Java 核心技术之入门指南:全面解析Java概述
-
大家好,这里是Java码牛!Java核心技术入门:全面解析Java概述一、引言Java,作为一门在当今信息技术领域中被广泛应用于企业级开发的主流编程语言,其核心技术的精准掌握对于众多开发者而言,具有...
- 小白如何轻松上手Java开发?
-
Java,这款流行的编程语言,被广大开发者所钟爱。但对于初学者来说,如何入门确实是一个大问题。尤其对于毫无经验的小白,从何处开始、如何推进,都是关键。本文将带你走进Java的世界,为你揭示从零到一的进...
- 初学Java应该知道的知识点:Java的程序开发是什么?
-
Java的程序开发是什么呢?下面和千锋广州小编一起来看看吧!一般来说,Java的程序开发包括三个步骤:编写程序,编译程序,运行程序编写程序——Java源代码,.Java文件编译程序——Javac用来进...
- 厉害了!全靠经典之作-Java编程思想,把小白教的明明白白
-
今天我们来聊聊这本《Java编程思想》从我学习Java的经验来看,《ThinkinginJava》是讲解Java编程的最佳书籍! 这本书不仅详细地介绍Java语法、知识点、API类库使用,更...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- patch补丁 (31)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- firebug 使用 (31)
- characterencodingfilter (33)
- getmonth (34)
- hibernate教程 (31)
- label换行 (33)
- curlpost (31)
- android studio 3 0 (34)
- android应用开发 (31)
- html转js (35)
- 索引的作用 (33)
- css3 0 (31)
- checkedlistbox (34)
- localhost 8080 (32)
- 多态 (32)
- net开发 (31)