package sample;
Java中一个非常简单的问题,当我尝试像一样做时
Parent parent = new Child(); // Works
但另一种方式是不可能的。像Child child = new Parent();
为什么?
第二,实例化类的子对象有什么区别
Child c = new Child(); vs Parent p = new Child();
我什么时候应该用什么?
下面的代码片段:
public class A{
public void display(){
System.out.println("hello");
}
}
class B extends A {
public void display(){
System.out.println("hi");
}
public static void main(String args[]) {
A a = new B();//works
a.display();
B b = new A();// doesnt work
}
}
Parent parent = new 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<Pet> pets = new ArrayList<Pet>();
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();
}
}
}
输出:MeowWoof
首先,您必须了解子类化本身是什么。
如果我有一个对象,比方说Tree
,我可以给这个对象一个方法列表,比如plant()
、water()
。
然后我想定义另一个类AppleTree
。好吧,苹果树仍然需要种植和浇水,所以我不会从Tree
类复制代码,而是将其子类化。所以AppleTree extends Tree
。
这意味着我现在可以直接在AppleTree
对象上调用Tree
的方法。然后,我可能会在AppleTree
中添加另一个方法,称为harvest()
。
现在让我们在另一个类中使用它。也许我有一个叫Orchard的班,里面有我所有的树。假设我有10棵树,其中2棵是AppleTrees
。在我的果园里,我想给我所有的树浇水。
我可以将我的所有树存储在ArrayList
中,如下所示:
ArrayList<Tree> trees = new ArrayList<Tree>();
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
包含一组树指针,它们不知道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
强制转换为AppleTree
的情况下调用t.harvest()
,因为对编译器来说,它只是一个Tree
,不知道harvest()
方法。
所以这将失败:
Tree t = new AppleTree();
t.harvest(); //error