前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java基础之向上转型与向下转型

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

作者头像
gfu
发布2019-08-28 14:41:04
5560
发布2019-08-28 14:41:04
举报
文章被收录于专栏:gfu

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

名称

功能

例子

向上转型(upCast)

通过子类实例化父类

A a=new B()

向下转型(downCast)

通过父类实例化子类

B b=new A()

先敲一波代码,再和大家解释
代码语言:javascript
复制
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。 意义 当我们需要多个同父类的对象调用父类的某一个方法是,可以通过向上转型统一方法和参数。

应用
代码语言:javascript
复制
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使用如下:

代码语言:javascript
复制
A a = new B();                 //向上转型 (B类是A的子类)

a instanceof A;                //返回true.
a instanceof B;                //返回true
a instanceof C;                //返回false
代码语言:javascript
复制
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对象的方法和自身的方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先敲一波代码,再和大家解释
  • 应用
    • 向下转型
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档