代码之家  ›  专栏  ›  技术社区  ›  DCR

java do扩展类有两种类型

  •  -2
  • DCR  · 技术社区  · 2 年前

    在java中,我有以下内容:

    ClassA obj = new ClassB();
    

    哪里 ClassB extends ClassA 。 是类型为的obj ClassA ClassB 还是两者兼而有之?

    如果我们改为:

    ClassB obj = new ClassB();
    

    很明显 obj 是类型 B类 但所有 B类 A类 他们也是,不是吗?这两种类型 A类 B类 ?

    如果我们添加以下内容:

    ClassA [] objects = new ClassA[3];
    ClassA obj = new ClassB();
    objects[0] = obj;
    

    看起来 obj 是类型 A类 。因此,即使obj是 new ClassB();

    这是我的困惑,假设我们在 B类 从…起 A类 ,我可以调用该方法,并从 B类 重写方法。但是,如果我只有 B类 中未包含的方法 A类 我不能称之为,而且我似乎也无法将其升级为 B类 。哦,等等, obj 是类型 A类 所以我们不能把它变成 B类 因为所有 A类 不是 B类 的。

    所以obj是类型 A类 但我们把它设置为 new ClassB() 。那到底是什么?是吗 A类 B类 ,我很困惑。为什么我们可以访问中的重写方法 B类 但不是非重写方法?多态性就是这样工作的吗?

    1 回复  |  直到 2 年前
        1
  •  4
  •   rzwitserloot    2 年前

    您的问题与这种情况相同:

    你看到了麦克斯,他是一只贵宾犬。你会问:那怎么回事?马克斯是贵宾犬、狗还是动物?还是三者同时出现?

    答案或多或少是“这个问题掩盖了我们对生物分类的误解”。如果你必须从有限的选项中进行选择,“It is all 3”比其他任何选项都更正确。但这意味着你可以创造一只同样是动物的贵宾犬,但 一只狗,这是错误的结论: 任何是贵宾犬的都是 必要地 也是一只狗

    这也取决于上下文。如果我问Max是什么“类型”的生物,而情况只需要一个答案,你总是会得到“贵宾犬”。因为这是最有用的答案——知道max是一只贵宾犬就足以确定max必然也是一只狗和一只动物,因为 根据定义, 全部的 贵宾犬是。你不可能拥有一只非狗的动物,但它却是贵宾犬

    因此:

    • Animal a = new Poodle(); 完全合法。Al贵宾犬是动物,所以,如果你的工作需要任何动物,贵宾犬都可以。吉娃娃也是。

    • Java做任何事情都是参考的。 Animal a; 就像宣布一个名为 a 包含 地址 一些动物生活的地方。地址甚至可以留空( null )。您可以保证,如果这张便利贴上有实际地址,它会 肯定 导致某种动物(比如说,它不会导致橡树、语言和运行时 保证 这个)。在这种情况下,事实上,它会导致一只贵宾犬。这很好:毕竟所有的贵宾犬都是动物。事实上,你的地址贴上写着“我可能会找到任何动物”,这并没有神奇地把max变成驴子,甚至变成“普通动物”——max仍然是一只贵宾犬:

    Poodle max = new Poodle();
    Animal a = max;
    System.out.println(a.getClass()); // prints 'Poodle'.
    

    记住,点运算符是“按照便利贴上的地址,问你在那里找到的东西一个问题”。 .getClass() 不会向 ,它向a所指的东西提问。目前,a指的是max。如果你问max他是什么(我想如果狗会说话),max会说“我是一只贵宾犬”。Max不会说“我是动物”;max不知道postit注释,也真的不知道:可能有85个postit,地址都是max。可能一个都没有了(例如,一旦方法结束,局部变量就不存在了,就好像postit注释被遗忘了一样)。当向对象提问时,他们不会了解“上下文”(你习惯的路线 发现 因此你知道他们的答案不可能依赖于它。

    • Poodle b = a; 不是 合法的这意味着:“把便利贴a上的地址复制到便利贴b上,这是有限制的,如果它指向任何东西,它就会指向一只贵宾犬。 即使 a目前正在指向一只贵宾犬,在编译时编译器不知道这一点,所以它不允许你这样做。并非没有演员阵容: Poodle b = (Poodle) a; 很好,因为这是在插话:“检查a是否真的在指向贵宾犬。如果确实是,那么一切都很好。但如果不是,请停止你正在做的一切,并以“ClassCastException”异常退出此过程。”。

    • 对象总是有很多类型。例如 new ArrayList<String> 全部的 其中: Serializable , RandomAccess , Iterable<String> , ArrayList<String> , AbstractList<String> , List<String> , AbstractCollection<String> , Collection<String> , Object ,也许还有一些我错过了。这不仅仅是类型层次结构(ArrayList扩展了AbstractList扩展了AbstractCollection扩展了Object),还包括您在这一过程中获得的所有接口,以及所有 他们的 超级接口。这符合现实生活。max是一只贵宾犬、一只狗、一种动物、一个肉食者、一个有腿的东西、一个尿源、一个两条腿的东西、雄性,还有很多其他的东西。所有这些同时发生。