我已经阅读了几篇关于Java中静态和动态绑定技术的文章。
我的问题是
之间的实际区别是什么Parent a = new Parent();
和
Parent a = new Child();
答案 0 :(得分:1)
如果你不想要Child
对象,那么第二种方法没有意义。
第二种方法仅在您需要子对象的情况下才有意义,但可以灵活地将Child
对象替换为Child2
或其他Child
对象,该对象透明地扩展Parent
对象在以后的时间点。
一个经常使用的示例案例是List
,ArrayList
,LinkedList
。如果要返回List对象类型,但可以灵活地在实现中将LinkedList替换为LinkedList(或)LinkedList和ArrayList,那么您可以编写如下代码:
List someRefer = new ArrayList();
在某些时候,如果您的实现需要大量插入/删除List,那么您意识到LinkedList是这种情况下的最佳数据结构,那么您可以灵活地将代码更改为:
List someRefer = new LinkedList();
答案 1 :(得分:1)
在第二种情况下,您将子对象分配给父对象,您允许子进程充当父对象,以便它可以与其他父对象进行交互。实际上,它仍然是一个拥有自己的字段和方法的孩子(被覆盖或不被覆盖),但现在你可以像使用父对象一样使用它。把它放在父母的数组中,将它与另一个父母比较等等。
答案 2 :(得分:1)
创建的情况也称为runtime polymorphism
,这意味着Jvm
将决定在运行时访问哪些类成员。对于前
class Parent {
public void disp() {
System.out.println("Parent");
}
}
public class Child extends Parent {
public void disp() {
System.out.println("Child");
}
public static void main(String args[]) {
Parent p = new Parent();
Parent p1 = new Child();
p.disp();
p1.disp();
}
}
输出
Parent
Child
表示jvm在指定的对象类型上调用方法。当您使用对象类型为Child时,它调用子方法,当您调用Parent时,它使用Parent方法。
答案 3 :(得分:0)
当你创建Child的对象时,Child和Parent有共同的方法假设display()。
Parent a = new Child();
a.display();
它调用运行时子类方法而不是父类。
修改强>
public class Parent {
public void display() {
System.out.println("Parent-----Display");
}
}
public class Child extends Parent{
public void display() {
System.out.println("This is child method.");
}
public static void main(String[] args) {
Parent parent=new Child();
parent.display();
}
}
输出:
This is child method.