一、前言
前面我们学习了多态的概述和使用,现在我们来学习前面剩下的转型问题。
二、转型
🗡 向上转型
🗡向下转型
为什么会有转型呢,前面我们也说到了,多态中的使用前提是有父类引用指向子类对象
还有多态的缺点就是不能访问子类对象。(可以用到向下转型访问)
向上转型
🗡其实多态中的父类引用指向子类对象就是向下转型,向下转型就是子到父。
就是将子类所申请的空间赋值给父类。形式: fu f=new zi();
向下转型
🗡向下转型的出现就是为了解决多态中无法访问子类成员的问题,其实向下转型本质上
就是强转,由父到子,父类对象转化为子类对象。形式:zi z= (zi)f ;
我们看个例子:
在fu类中
public class Fu { public void show(){ System.out.println("fu:1024程序员节"); } public void play(){ System.out.println("fu:1024不见不散"); } }
zi类中
public class Zi extends Fu { @Override public void show() {//重写fu类中的show方法 super.show(); System.out.println("zi:1024来了呀"); } public void game(){ System.out.println("zi:写篇博客提提神"); } public void juan(){ System.out.println("zi:全员卷王"); } }
新建一个测试类
public class FuZiDemo { public static void main(String[] args) { Fu f=new Zi();//向上转型 Zi z=(Zi)f;//向下转型 z.show(); z.game(); z.juan(); z.play(); } }
通过向上和向下转型,此时我们可以访问子类父类全部成员
🗡 其实虽然直接创建子类对象是非常方便的,但是我们多态的实现条件之一就是有
父类引用指向子类对象(接口的多态暂时不考虑)
public class FuZiDemo { public static void main(String[] args) { Zi z=new Zi();//通过子类直接创建对象 z.show(); z.game(); z.juan(); z.play(); } }
🗡由上述结果可知,子类对象向上转型为父类对象是不需要显示转换,而父类对象转化
为子类对象时,需要显示强制类型转化。
友情提示:向下转型还有几点需要注意的地方:
🗡①必须保证父类对象是子类的一个实例,否则程序报错。
🗡②向下转型的对象可以访问父类中的成员和方法,也可以访问子类中的成员和方法。
public class Demo11 { public static void main(String[] args) { Animal a=new Dog(); Dog g=(Dog)a; Cat c=(Cat)a;//??能否成功 } }
🗡上述代码中,父类对象a引用的是子类Dog对象,而不是Cat类对象,可以将a强
制转化为Dog类型,不能a强制转化为Cat类型,因为向下转型必须确保父类对象是
子类的一个实例所以这个程序不能成功,且在运行时会出现转换异常的警告。
三、instanceof运算符
instanceof的用处
🗡由上可知,向下转型必须确包父类对象是子类的一个实例,否则程序会异常,
instanceof 就是为了确保向下转型不出现异常。instanceof运算符用来在运行时
指出对象是否是特定类的一个实例
instanceof的使用格式:
🗡对象名 instanceof 类名
🗡instanceof返回一个布尔值来指出这个对象是否是这个特定类或者使他的子类的
一个实例。返回true则是,反之则不是。
public class Demo11 { public static void main(String[] args) { Animal a=new Dog(); if(a instanceof Dog){ Dog g=(Dog)a; } if( a instanceof Cat){//判断作用 Cat c=(Cat)a; } } }
🗡所以我们在进行向下转型之前采用instanceof运算符可以避免一些问题。