美文网首页
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基础之向上转型与向下转型

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

  • java多态(重要O!)

    一、多态的语法 关于java语言中的向上转型和向下转型 1、向上转型(upcasting):子 -->父 2、向下...

  • 12.多态中的向上转型和向下转型

    多态中向上转型与向下转型 多态的转型分为向上转型与向下转型两种: A:向上转型:当有子类对象赋值给一个父类引用时,...

  • 多态

    Java语言中的向上转型和向下转型, 1向上转型 (upcasting)子———>父 自动类型转换 2 ...

  • Java向上转型、向下转型

    向上转型:父类指向子类对象Person p = new SuperMan(); 例子:Person person ...

  • java向上转型、向下转型

    整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则: 容量小的类型可自动转换为容量大的数据类型;b...

  • java的多态性

    1、需有父子类关系,子类通过extends继承父类; 2、java多态性分为向上转型以及向下转型。 向上转型:...

  • java转型(向上与向下)

    开始的时候,总是不理解,为什么Java中要有转型这一概念。但是随着面向对象思想的加深,以及对Java的理解深入。才...

  • 第二十九节:Java基础知识-类,多态,Object,数组和字符

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,O...

  • JAVA:向下转型和instanceof运算符的应用

    知识梳理 一:向下转型 1.向下转型:向下转型是与向上转型相对的概念,他是用子类引用指向父类实例.如: 这时就告诉...

网友评论

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

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