美文网首页
java基础之向上转型与向下转型

java基础之向上转型与向下转型

作者: 爱吃苹果的西瓜 | 来源:发表于2019-07-22 16:46 被阅读0次

    一个事物的出现意味着他要去解决什么问题或者是衍生物,有时候大家不知道向上转型的意义,或者是说只是了解一个大概。那么我将详细给大家介绍一波。

    名称 功能 例子
    向上转型(upCast) 通过子类实例化父类 A a=new B()
    向下转型(downCast) 通过父类实例化子类 B b=new A()
    先敲一波代码,再和大家解释
    class UpCast {
        public static void main(String[] args) {
            A a =  new B();
            a.method0();
        }
    }
    
    class A {
        public void method0() {
            System.out.println("A::method0");
        }
        public void method() {
            System.out.println("A:method");
        }
    }
    
    class B extends A {
        @Override
        public void method0() {
            System.out.println("B:method0");
        }
    
        public void method1() {
            System.out.println("B:method1");
        }
    }
    
    a.method0()结果
    没有Class B中的方法


    我们可以看到,打印出来的是Class B的方法,但是用a.去调用方法的时候,没有B中的method1的方法。
    为什么?
    首先,我们实例化的是一个B的对象,但是我们将其强行转成了A(也就是通过父类实例化子类),为什么我们可以调B中的method0,因为我们写的方法覆盖了父类原有的方法,所以打印的是B。
    意义
    当我们需要多个同父类的对象调用父类的某一个方法是,可以通过向上转型统一方法和参数。

    应用
    class UpCast {
        public static void main(String[] args) {
            A a =  new B();
            a.method0();
    
            func(new B());
            func(new C());
    
        }
    
        static void func(A a) {
            a.method0();
        }
    }
    
    class A {
        public void method0() {
            System.out.println("A::method0");
        }
    
        public void method() {
            System.out.println("A:method");
        }
    }
    
    class B extends A {
    
        public void method0() {
            System.out.println("B:method0");
        }
    
        public void method1() {
            System.out.println("B:method1");
        }
    }
    
    class C extends B {
    
        public void method0() {
            System.out.println("C:method0");
        }
    
    }
    

    如果把C中的method0去掉,那么就会打印B中的method0,如果把B中的method0去掉,那么打印的就是A中默认的方法method0。这就是向上转型的好处。调用统一的方法。


    向下转型

    为了保证向下转型的顺利完成,在java中提供了一个关键字:instanceof,通过instanceof可以判断某对象是否是某类的实例,如果是则返回true,否则为false,instanceof使用如下:

    A a = new B();                 //向上转型 (B类是A的子类)
    
    a instanceof A;                //返回true.
    a instanceof B;                //返回true
    a instanceof C;                //返回false
    
    class DownCast {
    
        public static void main(String[] args) {
            func(new A());
            func(new B());
            func(new C());
        }
    
        static void func(A a) {
            a.method0();
            if (a instanceof B) {
                B b = (B) a;
                b.method();
            } else if (a instanceof C) {
                C c = (C) a;
                a.method();
            }
        }
    }
    
    class A {
        public void method0() {
            System.out.println("A::method0");
        }
    
        public void method() {
            System.out.println("A:method");
        }
    }
    
    class B extends A {
    
        public void method0() {
            System.out.println("B:method0");
        }
    
        public void method1() {
            System.out.println("B:method1");
        }
    }
    
    class C extends B {
    
        public void method0() {
            System.out.println("C:method0");
        }
    
    }
    
    结果

    解释:
    B向上转型成A之后,可以通过向下转型调用B自身的方法。
    注:举个例子,将B对象转成A对象之后(向上转型),同时经过向下转型之后,再次转成B对象,可以调用A对象的方法和自身的方法

    相关文章

      网友评论

          本文标题:java基础之向上转型与向下转型

          本文链接:https://www.haomeiwen.com/subject/faewlctx.html