Java访问父类和子类


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

最新更新