一.向上转型
class Animal{
public void eat(){
System.out.println("eating...");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("Cat eatting...");
}
public void miao(){
System.out.println("Cat miao~");
}
}
class Human {
public void sleep() {
System.out.println("sleep.");
}
}
class Male extends Human{
public void sleep() {
System.out.println("Male sleep.");
}
}
class Female extends Human {
public void sleep(){
System.out.println("Female sleep.");
}
}
public class Main{
public static void main(String[] args) {
//向上转型
Animal cat = new Cat();
cat.eat(); //输出Cat eatting...
cat.miao(); //报错ClassCastException类型转换异常
//b虽指向子类对象,但此时子类作为向上的代价丢失和父类不同的miao()方法
//传入的参数是子类
sleep(new Male());//输出Male sleep.
sleep(new Female());//输出Female sleep.
}
public static void sleep(Human h){ //方法的参数是父类
h.sleep();
}
}
为何不直接Bird b=new Bird();b.eat() 呢?这样就没有体现出面向对象的抽象的编程思想呀,降低了代码的可扩展性.
向上转型的好处?sleep传入的参数是子类,若是不用向上转型,那么有多少个子类就得在这儿写多少种不同的睡觉方法
二.向下转型
class Fruit{
public void myName(){
System.out.println("Fruit...");
}
}
class Apple extends Fruit{
public void myName() {
System.out.println("Apple...");
}
public void myMore(){
System.out.println("An apple a day keeps the doctor away.");
}
}
public class Main{
public static void main(String[] args) {
//向上转型
Fruit f=new Apple();
f.myName();//输出Fruit...
//向下转型
//f指向子类的对象,子类的实例a也指向f,向下转型后因为都是指向子类对象,调用的全是子类的方法
Apple a=(Apple)f;
a.myName();
a.myMore();
//向下转型之前必须进行向上转型
//编译无错但会运行会出错ClassCastException,子类aa不能指向父类ff
Fruit ff=new Fruit();
//对象名A instanceof 类名B ,判断这个对象A是否是属于这个类B或是其子类
if(ff instanceof aa){
Apple aa=(Apple)ff;
aa.myName();
aa.myMore();
}
else {
System.out.println("不能进行向下类型转换");
}
}
}
Java为了解决不安全的向下转型问题,引入泛型的概念
Java向下转型的意义(https://blog.csdn.net/xyh269/article/details/52231944):我们需要把很多种类的实例对象全部扔到一个集合,或者说把很多种类的子类实例对象全部扔到存放父类实例的集合。 经过了这个过程,子类实例已经赋值给了父类引用(即完成了向上转型),但很遗憾的丢失了子类扩展的方法。使用向下转型的特性,让我们可以重新获得丢失的方法,即强转回子类
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有