Java向上转型和向下转型的通俗简单理解以及使用用途

我的处女作《Canvas系列教程》在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作。

教程介绍、教程目录等能在README里查阅。

传送门:https://github.com/827652549/CanvasStudy

其他网上关于向上转型和向下转型并不能完全使读者透彻的了解,因此我决定重写一篇教程来让大家简单理解。

向上转型:将子类转化为父类。

向下转型:将父类转化为子类。

继承准备

        下面我们通过例子让读者一步步带入:

        转型是基于继承,所以先实现一个子类继承父类。

/**
 * 父类
 */
class Father {
	String name = "爸爸";
	public void sleep() {//睡觉方法
		System.out.println(name + "睡觉");
	}
}
/**
 * 子类继承父类
 */
class Son extends Father {
	String name = "儿子";
	public void p() {//调皮方法
		System.out.println(name + "调皮");
	}
}

表现形式

向上转型

public class UpAndDown {
	public static void main(String[] args) {
		// 向上转型:将父类引用指向子类对象
		Father f = new Son();
		f.sleep();//输出“爸爸睡觉”
      
        //如果f.p();编译出错,不可执行。因为p()不是Father的方法。
	}
}

        虽然f是Son对象向上转型得到的,但因为它此时属于Father类,并未实现子类的p()方法,所以不能使用f.p();此时可以看做是一种“瘦身”。

向下转型

        还是上面的例子,如果再强转为子类。代码如下。

public class UpAndDown {
	public static void main(String[] args) {
		// 向下转型
		Father f = new Son();
		((Son)f).P();//输出“儿子调皮”
	}
}

        是不是很惊喜?父类转化为子类,又恢复了子类独有的方法。

        那么,如果我们是直接向下转型呢?


public class UpAndDown {
	public static void main(String[] args) {
		// 直接向下转型
		Father f = new Father();
        f.sleep();//输出“爸爸睡觉”
		((Son)f).P();//报错!!!!!!!!!!
	}
}

看来,向下转型并不耽误父类方法的调用。

但是,直接向下转型竟然会报错!提示如下:

Exception in thread "main" java.lang.ClassCastException: lanqiao.Father cannot be cast to lanqiao.Son
    at lanqiao.UpAndDown.main(UpAndDown.java:7)

意思是说:类型转换异常,Father不能转化为Son。

这种现象我们可以通俗地理解:

  • 向上转型可以当做隐藏自身的方法,所以,再转回来(向下转型)方法就会恢复原状。该是你的还是你的。
  • 直接向下转型,父类不具有子类的独有方法,所以即使转化成功,也是个残废儿子,还不如不转,所以直接报错转化失败。不是你的你想都别想。

 其实吧,事情是这样的:

内存中,因为向上转型是父类的引用指向为子类的对象,所以,它只是指向了父类应该拥有的属性和方法,而子类的独有的方法和属性就不指向了(或者说隐藏了),当再强转到子类时。又重新指向了子类对象,那属于它的东西又恢复了。

来图:


        好了,那么转型有撒子用途呢?

向上转型和向下转型的使用

向上转型

我们这样理解,人都能跳舞,男人和女人跳舞是不一样的。(女装大佬请手下留情!)

假装有代码:

假设Person有个dance()跳舞方法。

Man extends Person      Women extends Person

此时Man和Women都重写了Person的dance();

当 Person p = new Man(); p.dance(); //这个时候就是调用男人跳舞的dance方法
当 Person p = new Woman(); p.dance();// 这个时候就是调用女人的跳舞的dance方法

这样其实就是一个java的继承,多态. 利于程序扩展. 你需要理解这种设计方式,会让你写出更易维护,简洁的代码。

向下转型

灵感不够,拷贝来凑:(不要揍我)

https://blog.csdn.net/xyh269/article/details/52231944


        忙了一下午,希望大家看了这篇教程之后会对向上转型和向下转型有更加深刻的理解,如果我这篇文章有什么不对的地方还请大佬们指出来,我一定虚心接受!还请给个赞~

  • 94
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Java中的编译类型和运行类型是指编译时期和运行时期的类型信息。 编译类型:在编译时期,Java编译器需要确定每个变量或表达式的类型,这个类型称为编译类型。编译类型是静态的,它是在编译时期就已经确定的。 运行类型:在程序运行时期,Java虚拟机需要确定对象的实际类型,这个类型称为运行类型。运行类型是动态的,在运行时期才能确定。 举个例子来说: 假设有一个父类Animal和它的两个子类Cat和Dog: ``` public class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } public class Cat extends Animal { public void makeSound() { System.out.println("Meow"); } } public class Dog extends Animal { public void makeSound() { System.out.println("Woof"); } } ``` 接下来,我们创建一个Animal类型的变量,但是实际上存储的是一个Cat对象: ``` Animal animal = new Cat(); ``` 这里就涉及到了向上转型向下转型向上转型:将子类对象赋值给父类引用变量,这个过程称为向上转型。例如上面的代码中,new Cat()创建了一个Cat对象,但是它被赋值给了Animal类型的变量,这就是向上转型向上转型是安全的,因为子类对象可以赋值给父类引用变量,但是反过来不行。 向下转型:将父类引用变量转换为子类对象,这个过程称为向下转型。例如,我们可以使用下面的代码将animal变量向下转型为Cat类型: ``` Cat cat = (Cat) animal; ``` 这里需要注意的是,向下转型是有风险的。因为在运行时期,animal变量的实际类型是Cat,所以可以成功转换。但是如果animal变量实际上存储的是一个Dog对象,那么向下转型就会抛出ClassCastException异常。因此,在进行向下转型时,我们需要确保变量的实际类型与转换类型一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值