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

java do扩展类有两种类型

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

    在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 回复  |  直到 3 年前
        1
  •  4
  •   rzwitserloot    3 年前

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

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

    答案或多或少是“这个问题掩盖了我们对生物分类的误解”。如果你必须从有限的选项中进行选择,“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是一只贵宾犬、一只狗、一种动物、一个肉食者、一个有腿的东西、一个尿源、一个两条腿的东西、雄性,还有很多其他的东西。所有这些同时发生。