java 类的向上向下转换

通俗理解向上转型:就是子类转型成父类。

  1. class A

  2. {

  3. }

  4. class B extends A

  5. {

  6. }

  7. A a = new B();

这个就是向上转型。
向上转化后只能调用父类的方法,

向下转型
A a = new B();
B a1 = (B) a;
只有经历过向下转型的对象才能向上转型

附:

子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。

但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。来看下面的例子:

A类:

package a.b;

public class A {

void aMthod() {

   System.out.println("A method");

}

}

A的子类B:

package a.b;

public class B extends A {

void bMethod1() {

   System.out.println("B method 1");

}

void bMethod2() {

   System.out.println("B method 2");

}

}

C类:

package a.b;

public class C {

 public static void main(String[] args) {

        A a1 = new B(); // 向上转型

        a1.aMthod();    // 调用父类aMthod(),a1遗失B类方法bMethod1()、bMethod2()

        B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误

        b1.aMthod();    // 调用父类A方法

        b1.bMethod1(); // 调用B类方法

        b1.bMethod2(); // 调用B类方法

        A a2 = new A();

        B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错

        b2.aMthod();

        b2.bMethod1();

        b2.bMethod2();

 }

}

从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行C程序,控制台将输出:

Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
a.b.C.main(C.java:14)

A method

A method

B method 1

B method 2

其实黑体部分的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类B的对象,所以子类B的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时ClassCastException异常?使用5.7.7节学过的instanceof就可以了。我们修改一下C类的代码:

A a2 = new A();

if (a2 instanceof B) {

B b2 = (B) a2;

b2.aMthod();

b2.bMethod1();

b2.bMethod2();

}

这样处理后,就不用担心类型转换时发生ClassCastException异常了

From 20180110 广州

推荐阅读更多精彩内容

  • 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向...
    木有鱼丸啦阅读 63评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 29,130评论 18 398
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 1,148评论 4 12
  • 开始的时候,总是不理解,为什么Java中要有转型这一概念。但是随着面向对象思想的加深,以及对Java的理解深入。才...
    乐百事52淑熙阅读 288评论 0 2
  • 大多数人都会轻易地夸赞别人,可他们中的大部分人都不曾想到——一句风轻云淡、张口就来的赞美会成为别人的负担! ...
    蜗牛_e88d阅读 113评论 0 1
  • 春节刚过,就要开学啦!从今天开始,进入开学倒计时最后一周,然而很多“熊孩子”还处在假期失控状态中,问题一箩筐:寒假...
    北极星小学教育阅读 103评论 0 0
  • 今天,为了筹备4月18日在林州市永和希望小学举行的“墨香二小、相约永和”基兆杯书法大赛作品展暨颁奖仪式,忙忙碌碌一...
    甲午之印阅读 46评论 0 0
  • 我也听过别人对我说情话,原来那么好听啊。 只是,如果是你就最好了。 当然,我有谢谢他,让我体验了心底开出花的感觉来...
    古时月白阅读 46评论 0 0
  • 上周,最后一次大型考试终于落幕,没有以往考试得心惊肉跳,不管是学生还是老师,对于这次考试,蛋定了很多。学生们已经...
    徐喵喵她妈阅读 448评论 0 0