Java基础之上转型下转型

上下转型

class Person{
	String name;
	int age;
	public void eat(){
		System.out.println("人要学会吃饭");
	}
	public void sleep(){
		System.out.println("人类必须睡觉才能活着");
	}
}

// 程序员
class Programmer{
	boolean isCoding;
	
	
	public void sleep(){
		System.out.println("程序员加班多,996福报睡得少");
	}
	public void coding(){
		System.out.println("必须熟悉编程且会写代码");
	}
}

public class PersonDemo{
	public static void main(String[] args){
		// 对象的多态性,父类的引用指向子类的对象
		Person per1 = new Programmer();
		// 多态的使用,当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 -- 虚拟方法的调用
		
		per1.sleep();// 调用的是new的子类Programmer中重写的sleep方法
		
		// 现在的对象per1拥有的属性和方法就是Person定义的属性和方法
		// 属性 名字 name、年龄 age
		// 方法 吃饭eat、睡觉sleep
		// 这个时候我们尝试使用per1.isCoding= true;或调用方法per1.coding()。 是没法直接这样操作的。详细原因请回看多态的讲解
		per1.isCoding= true;
		per1.coding(); 
		// 我们说new的对象都会加载到内存的堆空间上,类Programmer中所有属性和方法都会加载。只是我们有了对象的多态性以后,如per1实例化的时候我们在内存中加载了子类特有的属性和方法的。但是由于变量声明为父类类型,导致编译时只能调用父类中生命的属性和方法,子类中特有的属性和方法就不能调用。

		// 如何在父类中调用子类特有的属性和方法?
		// 让编译器在编译时可以调用子类特有的内容,理论上我们就可以,使用强制类型转换符[类比基本数据类型的转换],也称为向下转型。
		Programmer pro1 = (Programmer)per1;
		pro1.isCoding= true;
		pro1.coding(); 
		// 使用强转时,可能出现ClassCastException 的异常:
		// 可以使用instanceof 进行类的示例判断
		
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值