class C1 {
....
}
class C2 extends C1 {
....
}
public class Test {
public static void main(String args[]) {
C1 obiect = new C2();
}
}
为什么我可以用C1制作一个C2对象? C1 obiect = new C2();
和C2 obiect = new C2();
答案 0 :(得分:5)
稍微调整一下你的代码:
class Animal {
// ...
}
class Dog extends Animal {
// ...
}
public class Test {
public static void main(String args[]) {
Animal obiect = new Dog(); // A DOG (RHS) is ALSO an ANIMAL(LHS)
}
}
注:
如果您指向DOG并说它是动物,它只能做所有动物所做的事情(在ANIMAL类中定义的一般行为)。它可以睡觉(),吃()等。但它不能调用树皮()因为所有动物都不会吠叫。即,通过引用使用超类引用的子类实例,您将限制子类的所有方法的访问,即,您只能访问重写方法。
答案 1 :(得分:3)
你可以这样做的原因是因为多态性是面向对象的原则之一。
这个想法是对基类的引用(在您的情况下为C1
),可以将实例保存到任何子类(在您的情况下为C2
)。这允许您从接口解耦实现。
至于你的第二个问题,不同之处在于,当你声明引用属于C2
类型时,你将致力于C2
实现,而当引用的类型为{{1}时您可以将实现更改为任何C1
子类,或更改为C1
本身。
答案 2 :(得分:0)
C1 object=new C2();
此语句表示使用类C1
的引用创建C2类对象这主要用于面向对象原则Method Overriding
。借助于此,您可以调用C2类中定义的重写方法
答案 3 :(得分:0)
这称为父类引用子类对象。 C1是C2的父级,因此它可以用作对其所有子级以及它自己类型的对象的引用。
之间的基本区别C1 obiect1 = new C2();
和
C2 obiect2 = new C2();
object1 不了解子类(C2)方法和变量。因此,除了覆盖方法之外,您无法使用object1访问任何方法或变量od。但是您可以使用object2访问父(C1)和子(C2)方法和变量。
class Parent {
public String name;
}
class Child extends Parent{
public int salary;
}
public static void main(String[] args)
{
Parent parent = new Child();
parent.name= "abcd"; // allowed
//parent.salary= 12; // Not allowed
Child child = new Child();
child.name= "abcd"; // allowed
child.salary= 12; // allowed
}