分类
java

java向上转型和向下转型

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.每篇文末一个干货

逻辑运算符:

逻辑 &(与) |(或) !(非) ^(异或)

短路 && (短路与) || (短路或)

区别:& : 不论左边真假,右边都要进行运算

&& :如果左边为真,右边参与运算,如果左边为假,那么不参与运算 。

| 和 || 区别同理 。

除非注明,否则均为日常生活博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.mezgy.com/422.html

由日常生活

欣赏代码之美!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

有人回复时邮件通知我