对象类型转换

顾名思义:对象的类型转换

  • 对象的类型转换限制于子类父类之间的转换。
    例如:人这一父类与学生这一子类的相互转换
    但是要明白,不同转型方式会伴随不同的问题产生。
  • 先介绍转型类型

向上转型

形式:父类 obj = new 子类() ;
理解为将实例化的子类对象赋值于父类类型变量obj

这就是向上转型操作。
举例:
学生和人,将学生转型为人,这没问题,学生是人

向下转型

形式:子类 obj = new 父类() ;
理解为将实例化的父类对象赋值于子类类型变量obj

但是将人转型为学生,所有人人都是学生。这个说法肯定有问题的。
结论:可实例化的类,父类总是比子类抽象,

但是可以强制类型转换将父类对象转换为子类对象。

两种转型实验分析

完整代码,向下转型

package com.test;
class Person{
	Person(){
		System.out.println("父类构造" + Person.class.hashCode());
		}
	void m(){
		System.out.println("父类m方法执行");
	}
}
class Students extends Person {
	Students(){
			System.out.println("子类构造" + Students.class.hashCode());
	}
	void n(){
		System.out.println("子类n方法执行");
	}
}
public class Test {
	public static void main(String[] args) {										
//		-------------分割-------------- 
		//实例化子类,父类指向
		Person p_2 = new Person();
		//实例化父类,子类指向
		try {
			Students s_2 = (Students)p_2;
			s_2.n();			//强制类型转换了之后再调用子类方法
			s_2.m();			//父类方法调用
		}catch(Exception c){
			c.printStackTrace();
		}					
	}
}

运行结果
在这里插入图片描述
部分代码,向上转型:

public class Test {
	public static void main(String[] args) {										
//		-------------分割-------------- 
		//实例化子类,父类指向
		Person p_2 = new Students();
		//实例化父类,子类指向
		Students s_2 = (Students)p_2;
		s_2.n();
		s_2.m();
	}
}

结果
在这里插入图片描述
结果分析

  1. 出现了ClassCastException即类强制类型转换异常
    父类虽然强制转换成为了子类,但是在父类与子类的属性、方法体中存在的差异用强制转换是始终解决不了的。由此Java给出了instanceof操作符(见下文)先来判断父子类的对象。
  2. 只执行了父类的构造方法,强制类型转换了之后再调用子类方法无效。
  3. 向下转型需要谨慎使用
  4. 向上转型没出问题,验证子类转型父类(将一个具体的类变得抽象起来,因此这也使得这样的一个类型转换更安全)

Java的多态为何可以由子类实例化父类?: https://www.zhihu.com/tardis/landing/360/ans/573791530?query=Java%E7%9A%84%E5%A4%9A%E6%80%81%E4%B8%BA%E4%BD%95%E5%8F%AF%E4%BB%A5%E7%94%B1&mid=799cee2b148c5e899263e45acac3326e&guid=C17C0F57B580A06F6D196A2D3DFF34FC.1581235349790.

instanceof操作符判断对象类型,为向上转型服务或作单纯判断

用途:判断父类是否为子类对象的实例
语法格式:

某类对象的引用 instanceof 某个类
upobject instanceof ExampleClass

实例:

package com.test;
class Person{
}
class Students extends Person {
}
public class Test {
	public static void main(String[] args){
		Person p_1 = new Person();
		Students s_1 = new Students();
		System.out.println(p_1 instanceof Students);
		System.out.println(s_1 instanceof Person);
	}
}

结果:
在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值