java

您所在的位置:网站首页 java父类与子类例子 java

java

2024-07-14 20:57| 来源: 网络整理| 查看: 265

2 个答案:

答案 0 :(得分:2)

Parent parent = new Child();

之所以有效,是因为这是继承,更大的容器(父类型引用变量)可以容纳子对象,反之亦然是不可能的。 parent 的所有属性(方法)都必须作为继承的一部分出现在 child 中,所以

Parent parent = new Child(); // works

但是孩子可以拥有父母中不存在的其他东西(方法/属性),这就是为什么

Child child = new Parent(); // doesn't work Child c = new Child(); vs Parent p = new Child();

这是多态的一部分 这里有一个例子来解释,当 Pet pet = new Dog();然后我们调用 pet.makeSound() vrs Dog dog = new Dog();然后我们调用 dog.makeSound()

import java.util.ArrayList; import java.util.List; abstract class Pet{ public abstract void makeSound(); } class Cat extends Pet{ @Override public void makeSound() { System.out.println("Meow"); } } class Dog extends Pet{ @Override public void makeSound() { System.out.println("Woof"); } } public class PolymorphismDemo{ public static void main(String args[]) { //Now Pet will show How Polymorphism work in Java List pets = new ArrayList(); pets.add(new Cat()); pets.add(new Dog()); //pet variable which is type of Pet behave different based //upon whether pet is Cat or Dog for(Pet pet : pets){ pet.makeSound(); } } }

输出: 喵 呜

答案 1 :(得分:2)

首先,您必须了解子类化本身是什么。

如果我有一个对象,比如说 Tree,我可以给那个对象一个方法列表,比如 plant()、water()。

然后我想定义另一个类,AppleTree。好吧,一棵苹果树仍然需要种植和浇水,因此我不会从 Tree 类中复制该代码,而是将其子类化。所以AppleTree extends Tree。

这意味着我现在可以直接在 Tree 对象上调用 AppleTree 的方法。然后我可能会向 AppleTree 添加另一个名为 harvest() 的方法。

现在让我们在另一个类中使用它。也许我有一个名为 Orchard 的类,其中包含我所有的树木。假设我有 10 棵树,其中 2 棵树是 AppleTrees。在我的果园里,我想给我所有的树浇水。

我可以像这样将我所有的树存储在 ArrayList 中:

ArrayList trees = new ArrayList(); for(int i = 0; i < 8; i++) { Tree t = new Tree(); trees.add(t); } for(int i = 0; i < 2; i++) { AppleTree a = new AppleTree(); trees.add(a); }

然后我可以遍历 ArrayList 中的每棵树,并对每棵树调用 water()。

for(int i = 0; i < trees.size(); i++) { trees.get(i).water(); }

然而,现在我想收获我所有的树,但其中只有 2 棵是 AppleTrees 并且知道 harvest() 方法。所以我不能这样做:

for(int i = 0; i < trees.size(); i++) { trees.get(i).harvest(); //compiler error }

这是因为我的 ArrayList 持有一组 Tree 指针,它不知道 harvest() 方法。不是我所有的 Trees 都是 AppleTrees,Tree 的类签名与 AppleTree 的类签名不匹配。

所有 AppleTree 对象都是 Tree 对象,所以没问题:

Tree t = new AppleTree();

然而,并非所有的 Trees 都是 AppleTrees,所以这不起作用:

AppleTree a = new Tree(); //error

需要注意的是,如果我这样定义 Tree:

Tree t = new AppleTree();

即使 t 包含一个 AppleTree 对象,我也不能在不将 t.harvest() 强制转换为 t 的情况下调用 AppleTree,因为对于编译器来说,它是只是一个 Tree 并且不知道 harvest() 方法。

所以这会失败:

Tree t = new AppleTree(); t.harvest(); //error


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3