Java面向对象之多态、向上转型和向下转型

文章目录

  • 前言
  • 一、多态
  • 二、引用类型之间的转换
      • Ⅰ.向上转型
      • Ⅱ.向下转型
  • 总结


前言

 今天继续Java面向对象的学习,学习面向对象的第三大特征:多态,了解多态的意义,以及两种引用类型之间的转换:向上转型、向下转型。
 希望能对你的学习有所帮助!


提示:以下是本篇文章正文内容,Java系列学习将会持续更新

一、多态

(1)基本概念

多态就是指一个引用可以表示多种状态。意义在于实现参数统一化。

饮料:可乐、雪碧、红牛、美年达、…
宠物:狗、猫、鸟、…
整数: byte b = 10; short s = 10; int i = 10;…

C++多态分为两种:编译多态、运行时多态

Java的多态只有一种,就是运行时多态。是一种运行期间的行为,而不是编译期的行为。

(2)语法格式

  父类类型 引用 = new 子类类型();

 	Person ps = new Student();
 	ps.show();

解析:
  在编译阶段ps是Person类型,因此调用Person类自己的show()方法,若没有则编译的时候就报错。
  在运行阶段ps真正指向的对象是Student类型,因此最终调用的是Student类中自己的show()方法。

  当使用多态方式调用方法的时候,首先会检查父类中是否有该方法,如果没有,则编译报错。
  如果有,再去调用子类的同名方法。(注意:静态static方法属于特殊情况,静态方法只能继承,不能重写override,如果子类中定义了同名同形式的静态方法,它对父类方法只能起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)

多态存在的三个比较条件:
  1.要有继承
  2.要有重写
  3.父类的引用指向子类的对象

(3)多态的效果

 1.对于指向子类对象的父类来说,在编译期间只能调用父类的方法,不能直接调用子类的方法。
 2.对于父子类都有的非静态方法来说,最终调用子类中的重写版本。
 3.对于父子类中都有的静态方法来说 ,最终调用父类中的版本,与指向的对象类型无关。

(4)案例

public class TestPersonStudent {
	public static void main(String[] args) {
	
		//使用父类的引用指向父类自己的对象
		Person p = new Person();
		p.show(); 
        /**
         * 运行结果:
         * 小白  18
         */
         
		//使用子类的引用指向子类自己的对象
		System.out.println("--------------------");
		Student s = new Student();
		s.show();
        /**
         * 运行结果:
         * 小白  18
         * 学号是1
         */
		
		//使用父类的引用指向子类的对象,形成多态
		System.out.println("--------------------");
		//发生由Student类型向Person类型的转换,小范围向大范围,自动类型转换
		Person ps = new Student("小黑",19,2);
		//解析:在编译期间调用的是Person.show(),在执行期间调用的是Student.show()
		ps.show();
		/**
         * 运行结果:
         * 小黑  19
         * 学号是2
         */
        
		//使用ps调用非静态方法进行测试
		System.out.println("--------------------");
		String str = ps.getName();
		//ps是Person类型的引用,因此可以调用Person类的方法
		System.out.println("获取到的名字是"+str);
		/*
		 * int num = ps.getId(); (X)
		 * 子类可访问调用父类的信息,但父类无法访问调用子类
		 */
		/**
         * 运行结果:
         * 获取到的名字是小黑
         */ 
        
		//使用ps调用静态方法进行测试
		System.out.println("--------------------");
		ps.test(); //警告
		Person.test(); //静态成员推荐使用类名.的方式访问
		//ps.test2(); (X)
		Student.test(); //当Student类中没有test()时,会自动调用父类中的test()
		Student.test2();
		/**
         * 运行结果:
         * Person类的静态方法
         * Person类的静态方法
         * Person类的静态方法
         * Student类的静态方法
         */
        
		//如何实现子类方法的调用
		System.out.println("--------------------");
		//由Person类型向Student类型的转换,大-》小,强制类型转换
		Student st = (Student) ps;
		int num = st.getId();
		System.out.println("ID是"+num);
        /**
         * 运行结果:
         * ID是2
         */
	}
}

回到目录…

二、引用类型之间的转换

(1)基本概念
  引用类型之间的转换必须发生在父子类之间,分为自动类型转换(向上转型)和强制类型转换(向下转型)。

Ⅰ.向上转型

父类引用指向子类对象:

Animal dog = new Dog();

把一个子类对象转换为父类对象,这种转型一共发生在三个地方:

①产生对象时

Animal animal = new Dog();

②方法参数传递

public void fun(Animal animal){}

fun(new Dog());

③方法返回值

public Animal test(){
   return new Dog();
}

注意:
  当执行animal.eat();时,因为new的是子类Dog,所以是运行子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法。若子类没有重写,则调用父类的方法。
  父类中的静态方法无法被子类重写,所以向上转型之后只能调用父类原有的静态方法。

Ⅱ.向下转型

  子类引用指向父类实例,必须进行强制类型转换,可以调用子类特有的方法。

	Animal animal = new Bird();
	Bird bird = (Bird) animal;
	bird.fly();

这种转型有一定的风险性:

	Person ps = new Student(“小黑”,19,2);
	Teacher t = (Teacher)ps;  (X)

  当没有父子类关系发生强制类型转换则编译报错,当拥有父子类关系发生强制转换是编译通过;若目标类型并不是该引用真正指向的类型时,在运行阶段发生类型转换异常。

转型的前提:必须满足转型的条件

  为了避免上述错误的发生,通常只要进行强制类型转换就需要进行判断,格式如下:
if (引用变量名 instanceof 数据类型) {}

  instanceof 运算符可以进行判断,左侧对象是否满足右侧对象类型的特征。满足则返回true,否则返回false

 if(animal instanceof Bird){}

回到目录…


总结

提示:这里对文章进行总结:
以上就是今天的学习内容,本文是继续Java面向对象的学习,学习了多态、向上转型、向下转型,这些内容刚开始会觉得难理解,多写就会熟悉。之后的学习内容将持续更新!!!

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

2022-2028年中国在线旅行预订市场投资分析及前景预测报告

【报告类型】产业研究 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了在线旅行行业相关概述、中国在线旅行行业运行环境、分析了中国在线旅行行业的现状、中国在线旅行行业竞争格局、对中…