java对象的类型转换对于初学者来说很多时候是蒙的,例如当初开始学的我,#手动狗头。在整理以前学的笔记的时候看到了注释要重点看,在想想自己好像几个月没有更新了,今天来水一下java类型转换问题。
1.知识速记
Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。
Java转型分为向上转型和向下转型
向上转型(up casting):父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。
向下转型(down casting):将父类转化为子类。需要强制类型转换。在向下转型的时候我们常常用到java关键字instanceof。
instanceof关键字语法格式:对象(或者对象引用变量) instanceof 类(或接口)
先来说一下向上转型。
2.向上转型:属于自动类型转换
通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
直接看代码:
public class UpCasting {
public static void main(String[] args) {
//向上转型:将父类引用指向子类对象
Animal b=new Bird();//将Bird类当作Animal类来使用
b.eat();
/*此处将调用子类的 eat() 方法。
原因:b 实际指向的是 Bird 子类,故调用时会调用子类本身的方法。
需要注意的是向上转型时 b 会遗失除与父类对象共有的其他方法。
如本例中的 fly 方法不再为 b 所有。
*/
// b.fly();
// b虽指向子类对象,但此时丢失fly()方法
}
}
class Animal{
public void eat(){
System.out.println("animal eatting...");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("bird eatting...");
}
public void fly(){
System.out.println("bird flying...");
}
}
运行结果输出: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.每篇文末一个干货
逻辑运算符:
逻辑 &(与) |(或) !(非) ^(异或)
短路 && (短路与) || (短路或)
区别:& : 不论左边真假,右边都要进行运算
&& :如果左边为真,右边参与运算,如果左边为假,那么不参与运算 。
| 和 || 区别同理 。
除非注明,否则均为日常生活博客原创文章,转载必须以链接形式标明本文链接
谢谢分享,这正是我要找的 ,我的博客,欢迎回访
大力顶起。。。。
学到了,非常棒