zoukankan      html  css  js  c++  java
  • 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    彻底理解多态
    变量可以存储在堆中,栈中,方法区中。哪里都可以啊。对象只能存储在堆中
    json序列化后的是字符串,不是二进制。是字符串!!!确定不是二进制!!!
    线程流程理解
    增加一个类的功能可以采用继承或者代理模式或者装饰者模式
    Java 代理模式和装饰者模式的区别
    异常不管咋样,只要抛出了,不管是方法级别抛出,还是类级别抛出。终究有一个地方要对异常进行处理
    汉高澳大利亚sinox为什么不能下载源代码,因为sinox执行unix/linux/windows规划
    使用Visual Studio将Objective-C编译C++
    百度编辑器ueditor简单易用
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11143354.html
Copyright © 2011-2022 走看看