【问题标题】:Down Casting to indirect subclass does not work?向下转换为间接子类不起作用?
【发布时间】:2016-10-17 10:48:07
【问题描述】:
        public class A
    {

      public void printA(){
        System.out.println("A");  
      }

    }


    public class B extends A
    {
       public void printB(){
        System.out.println("B");  
      }

    }

    public class C extends B
    {
       public void printC(){
        System.out.println("C");  
      }

    }

    public class test {
        public static void main(String[] args)
      {

     A  a = new B();
          a.printA(); // work

        B b = (B) a;
          b.printB(); // work

          C c = (C) b;
          c.printC(); // not work throw  java.lang.ClassCastException

      }
}

我有三个班级 A 和 B 和 C
C 从 B 延伸,B 从 A 延伸
为什么向下转换从 A 到 B 工作,而不是从 B 到 C 工作,尽管它们之间的关系像 A 和 B ,B 是 C 的父级,那么它如何工作 JVM??

【问题讨论】:

  • 不能改变对象的类,只能改变引用的类。
  • 我不明白我在哪里尝试更改代码中的对象类??
  • 当您执行(C) b 时,您试图假装这会将对象的类型更改为C,但事实并非如此。对象的类型始终是B
  • 但是 B 是 C 的父级,这是真的吗?所以 C 是 instanceof B,我可以进行强制转换吗!
  • 这已经在互联网上的许多地方进行了解释。在 stackoverflowers 的所有方面,我怀疑将在此线程中编写的任何内容都会比已经存在的内容更清晰。请进行研究并研究资源。

标签: java inheritance casting multiple-inheritance downcast


【解决方案1】:

类只能转换为它们的父类,它们不知道它们的子类。

由于您的对象是B 的实例,因此它不实现C 的方法。

这将起作用:

  A  a = new C();
  a.printA(); // work

  B b = (B) a;
  b.printB(); // work

  C c = (C) b;
  c.printC(); // work 

【讨论】:

  • 您只能将类投射到它的父级,但不能投射到它的子级。因为类对子类一无所知。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2021-12-23
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
相关资源
最近更新 更多