26 02向上转型和向下转型的总结和作用

向上转型:父类引用指向子类对象,例如:Father f1 = new Son();  当子类向上造型后的对象的方法中不存在子类的自己的特色的方法,只有父类的方法。而且子类对于父类进行重写的方法。向上造型的对象的方法为重写后新的方法。

在这个例子中 person类分别是man,weman,child 的父类

package DAY12;

public class Demo {

    public static void main(String[] args) {
        Person p=new man();//向上转型,编译是Person对象,运行的时候是man类对象 声明是父类,调用的方法却只能是子类的
        System.out.println(p.getClass());//class DAY12.man
        p.speak();// 我是man类          此时运行调用的是man类中的方法
    }

}
class Person{
    String name;
    int age;
    void speak()
    {
        System.out.println("我是Person类,是所有人的父类");
    }
}
class man extends Person
{
    void speak() {
        System.out.println("我是man类");
    }
    void doThing() {
        System.out.println("我是man类,我可以做重活"); //这是子类的特有方法
    }
}

class weman extends Person
{
    void speak() {
        System.out.println("我是weman类");
    }
    void doThing() {
        System.out.println("我是weman类,我可以做针线活"); //这是子类的特有方法
    }
}

class child extends Person
{
    void speak() {
        System.out.println("我是child类");
    }
    void doThing() {
        System.out.println("我是child类,我可以玩游戏"); //这是子类的特有方法
    }
}

.向下造型:把指向子类对象的父类引用赋给子类引用,需要强制转换,父类引用的对象转换为子类类型。但是对于父类的引用对象一定要是由子类实例化的,也就是说向下造型的出现一般的情况都是和向上造型一起出现的。例如:

Father f1 = new Son();

Son s1 = (Son)f1;

但有运行出错的情况:

Father f2 = new Father();

Son s2 = (Son)f2;//编译无错但运行会出现错误

在不确定父类引用是否指向子类对象时,可以用instanceof来判断:

if(f3 instanceof Son){

     Son s3 = (Son)f3;

}

也可以来个通俗点的:

A类是父类,B类是子类

A a = new A(); B b = new B();

A a1 = b; ---向上造型

B b1 =(B)a1;-----向下造型

B b2 = (A)a;--------这个就会报错。ClassCastException

详情可以看我的https://www.cnblogs.com/xuwangqi/p/11106535.html

作用:就好像是一个工厂可以生产多种品牌的电脑,那么我们让工厂生产的时候如果是按品牌给工厂,那么我们要工厂开多个品牌的流水线生产,而不同品牌的电脑又可以统称为电脑,这个时候我们给工厂就让他生产电脑,等他生产出来的时候我们在贴上不同品牌的商标。这样让工厂的使用更方便了。

这个过程就是电脑作为不同品牌的父类,生产的时候先向上转型成电脑,随后在向下转型转换为个品牌的电脑。讲的不好,请谅解。


---------------------
作者:Syaxis
来源:CSDN
原文:https://blog.csdn.net/syaxis/article/details/54585086
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/xuwangqi/p/11143354.html