Java小白入门200例84之Java对象类型转换向上转型和向下转型

Posted 编程界明世隐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java小白入门200例84之Java对象类型转换向上转型和向下转型相关的知识,希望对你有一定的参考价值。

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、javascript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

引言

很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢?
其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大佬的路上一去不复返(切记要亲手练习哦)!

导航

✪ Java小白入门200例系列目录索引
◄上一篇  83.Java super关键字详解
►下一篇  85.为什么使用向上转型而不直接创建子类对象

概述

Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类是父子关系)主要有两种,分别是向上转型和向下转型。

向上转型

向上转型就是把子类对象直接赋给父类引用,不用强制转换。使用向上转型可以调用父类类型中的所有成员,不能调用子类类型中特有成员,最终运行效果看子类的具体实现。

实例1

父类People

package demo.demo84;

public class People {
	// 吃饭
	public void eat() {
		System.out.println("吃饭");
	}

	// 睡觉
	public void sleep() {
		System.out.println("睡觉");
	}
}

子类Student

package demo.demo84;

public class Student extends People {

	//在校学习
	public void learnInSchool() {
		System.out.println("在校学习");
	}
}

测试类

package demo.demo84;

public class Test {

	public static void main(String[] args) {
		People people = new Student();
		people.eat();
		people.sleep();
	}
}

运行结果:

吃饭
睡觉

分析:

People people = new Student();

从这句代码看出什么,就是说子类Student的实例对象可以直接父类引用来使用,而且还不需要强制转换。

实例2

既然是子类的实例,我想调用子类中的learnInSchool 方法行不行呢?
首先通过编译工具也找不到这个方法。

即便我们把方法直接写上去,也会提示错误

分析:
当向上转型之后,父类引用变量可以访问子类中属于父类的属性和方法,但是不能访问子类独有的属性和方法。
而 learnInSchool 就是子类独有的方法。

向下转型

向下转型可以调用子类类型中所有的成员,不过需要注意的是如果父类引用对象指向的是子类对象,那么在向下转型的过程中是安全的,也就是编译是不会出错误。但是如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现我们开始提到的 Java 强制类型转换异常,一般使用 instanceof 运算符来避免出此类错误。

上例中的 learnInSchool 不能通过父类引用调用,那我再次转型,转成子类行不行?

实例1

package demo.demo84;

public class Test {

	public static void main(String[] args) {
		People people = new Student();
		//向下转型
		Student student = (Student)people;
		student.eat();
		student.sleep();
		student.learnInSchool();
	}
}

运行结果:

吃饭
睡觉
在校学习

分析:
为啥可以向下转型呢?只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型。

实例2

用兄弟类测试一下转型,增加一个Teacher类

package demo.demo84;

public class Teacher extends People {

	//在校教书
	public void teachInSchool() {
		System.out.println("在校教书");
	}
}

测试类

package demo.demo84;

public class Test2 {

	public static void main(String[] args) {
		//向上转型
		People people = new Teacher();
		people.eat();
		people.sleep();
	}
}

运行结果:

吃饭
睡觉

向上转型是没有问题的,

package demo.demo84;

public class Test2 {

	public static void main(String[] args) {
		People people = new Teacher();
		//向下转型
		Teacher teacher = (Teacher)people;
		teacher.eat();
		teacher.sleep();
		teacher.teachInSchool();
	}

}

运行结果:

吃饭
睡觉
在校教书

向下转型也是没有问题的

那我想兄弟类之前强制转换一下呢?如下:

package demo.demo84;

public class Test2 {

	public static void main(String[] args) {
		People people = new Teacher();
		//向下转型
		Student student = (Student)people;
		student.eat();
		student.sleep();
		student.learnInSchool();
	}
}

编译是没有错误的,但是运行会发生类型转换错误。

Exception in thread “main” java.lang.ClassCastException: demo.demo84.Teacher cannot be cast to demo.demo84.Student
at demo.demo84.Test2.main(Test2.java:8)

类型强制转换时想运行成功就必须保证父类引用指向的对象一定是该子类对象,最好使用 instanceof 运算符判断后,再强转:

package demo.demo84;

public class Test2 {

	public static void main(String[] args) {
		People people = new Teacher();
		//向下转型
		if(people instanceof Student){
			Student student = (Student)people;
			student.eat();
			student.sleep();
			student.learnInSchool();
		}
		//向下转型
		if(people instanceof Teacher){
			Teacher teacher = (Teacher)people;
			teacher.eat();
			teacher.sleep();
			teacher.teachInSchool();
		}
	}
}

运行结果

吃饭
睡觉
在校教书

这样处理的话,程序就不会报错了。

通俗地说:
子类的对象可以转换成父类类型,而父类的对象实际上无法转换为子类类型。因为通俗地讲,父类拥有的成员子类肯定也有,而子类拥有的成员,父类不一定有。因此,对于向上转型,不必使用强制类型转换。
如果两种类型之间没有继承关系,那么将不允许进行类型转换。

小结

这节总结了“ Java对象类型转换向上转型和向下转型 ”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】+ 【评论区打卡】, 如果有兴趣跟小明哥一起学习Java的,【关注一波】不迷路哦。

评论区打卡一波让我知道你,明哥会持续关注你的学习进度哦!

导航

✪ Java小白入门200例系列目录索引
◄上一篇  83.Java super关键字详解
►下一篇  85.为什么使用向上转型而不直接创建子类对象

热门专栏推荐

1.Java小游戏系列(俄罗斯方块、飞机大战、植物大战僵尸等)
2.JavaWeb项目实战(图书管理、在线考试、宿舍管理系统等)
3.JavaScript精彩实例(飞机大战、扫雷、贪吃蛇、验证码等)
4.Java小白入门200例
5.从零学Java、趣学Java、以王者荣耀角度学Java

以上是关于Java小白入门200例84之Java对象类型转换向上转型和向下转型的主要内容,如果未能解决你的问题,请参考以下文章

Java小白入门200例71之Java创建对象

Java小白入门200例72之Java访问对象的属性和行为

Java小白入门200例61之java中Date日期类型的大小比较

Java小白入门200例85之为什么使用向上转型而不直接创建子类对象

Java小白入门200例98之Java异常

Java小白入门200例95之Java匿名类