前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java向上转型和向下转型

Java向上转型和向下转型

作者头像
chenchenchen
发布2023-01-30 17:03:58
5540
发布2023-01-30 17:03:58
举报
文章被收录于专栏:chenchenchen

一.向上转型

代码语言:javascript
复制
 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传入的参数是子类,若是不用向上转型,那么有多少个子类就得在这儿写多少种不同的睡觉方法

二.向下转型

代码语言:javascript
复制
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):我们需要把很多种类的实例对象全部扔到一个集合,或者说把很多种类的子类实例对象全部扔到存放父类实例的集合。 经过了这个过程,子类实例已经赋值给了父类引用(即完成了向上转型),但很遗憾的丢失了子类扩展的方法。使用向下转型的特性,让我们可以重新获得丢失的方法,即强转回子类

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档