java对象的类型转换对于初学者来说很多时候是蒙的,例如当初开始学的我,#手动狗头。在整理以前学的笔记的时候看到了注释要重点看,在想想自己好像几个月没有更新了,今天来水一下java类型转换问题。
1.知识速记
Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。
Java转型分为向上转型和向下转型
向上转型(up casting):父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。
向下转型(down casting):将父类转化为子类。需要强制类型转换。在向下转型的时候我们常常用到java关键字instanceof。
instanceof关键字语法格式:对象(或者对象引用变量) instanceof 类(或接口)
先来说一下向上转型。
2.向上转型:属于自动类型转换
通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
直接看代码:
运行结果输出:bird eatting...
注意:虽然b是Bird对象向上转型得到的,但因为它此时属于Animal类,并未实现子类的fly()方法,所以不能使用b.fly();此时可以看做是一种“瘦身”。
3.向下转型:需要强制类型转换
与向上转型相反,即是把父类对象转为子类对象。
直接看代码:
public class DownCasting { public static void main(String[] args) { //向上转型,子类对象转为父类对象。b对象没有fly()方法 Animal b = new Bird(); //向下转型,父类对象转为子类对象。bird对象拥有eat()和fly方法 Bird bird = (Bird) b; bird.eat();//现在bird还是指向 Bird对象 bird.fly(); /*Dog dog = (Dog) b; dog.eat(); //出错,java.lang.ClassCastException //注意:编译没有错,但是运行时会报错 */ //这种情况java提供关键字instanceof来判断防止出现异常 if (b instanceof Dog){ Dog dog = (Dog) b; dog.eat(); }else { System.out.println("该对象的类型不是Dog!"); } } } //定义接口Animal interface Animal{ void eat(); } //定义Bird类实现Animal接口 class Bird implements Animal { //实现接口eat()方法 public void eat(){ System.out.println("bird eatting..."); } //定义Bird特有fly()方法 public void fly(){ System.out.println("bird flying..."); } } //定义Dog类实现Animal接口 class Dog implements Animal{ //实现接口eat()方法 public void eat() { System.out.println("Dog eatting..."); } }
运行结果:
bird eatting...
bird flying...
该对象的类型不是Dog!
4.总结
Java转型:父类引用指向子类对象。
向上转型属于自动转型。
向下转型需要强制转型,注意异常ClassCastException。我们需要先用instanceof判断。
5.每篇文末一个干货
逻辑运算符:
逻辑 &(与) |(或) !(非) ^(异或)
短路 && (短路与) || (短路或)
区别:& : 不论左边真假,右边都要进行运算
&& :如果左边为真,右边参与运算,如果左边为假,那么不参与运算 。
| 和 || 区别同理 。