2014-10-01 21 views
1

我知道,在处理Java中的多态性时,可以为对象指定与对象类型不同的声明类型。例如:Java中具有不同引用类型的对象类型的优点是什么?

Parent foo = new Child(); 

我主要是看到它时声明的类型是一个接口,如:

Map<Integer,BigInteger> memo = new TreeMap<Integer,BigInteger>();  

我这看到了很多在人们的Java代码。当它是一个Child对象时,将foo声明为Parent有什么好处?我也明白,如果我们这样做,foo不能再调用任何未在Parent中声明为抽象或定义的方法。令我感到困惑的是,当我们可以同时拥有声明和实际类型的Child并且仍然将其作为参数传递给需要Parent参数对象的方法时,我看到了这一点。例如:

Child fooNew = new Child(); 
    public void showObj(Parent o){ 
     System.out.println(o); } 
    showObj(fooNew); 

那么是什么给?在什么情况下为对象设定不同的声明和实际类型会有好处?我的书说它对泛型编程很重要,但没有解释。我看到它始终如一地使用,但毫无头绪。它甚至似乎有其自身的一些缺点。

+0

从Oracle了解孩子:http://docs.oracle.com/javase /tutorial/java/generics/why.html – 2014-10-01 04:37:29

+0

@ScaryWombat原理是一样的。 – ajb 2014-10-01 04:37:50

+0

当父母有多个孩子覆盖一个或多个父母方法时,这是有意义的。您可以将不同子项的实例放入由父类型定义的某些集合中,并且在调用重写方法时,JVM将为每个子实例适当地调用此方法。 – 2014-10-01 04:38:45

回答

0

您可能有许多继承自Parent类的类。 foo变量可以存储任何这些类的实例,并且使用它的代码可以是通用的(即,它可以在不知道使用了哪个特定的父类子类的情况下工作)。

使用接口类型(如Map)的变量并在其中存储对实现该接口的实例的引用也是如此。

+0

你介意扩大“使用它的代码可以更普遍”。 – bmcentee148 2014-10-01 04:40:42

+0

@ bmcentee148如果代码仅依赖于用作变量类型的接口/超类的方法,则它可以与超类的接口或子类的许多不同实现一起工作(即使这些实现在编写可用的代码时尚未开发)。 – Eran 2014-10-01 04:44:18

+0

谢谢,我开始明白了。 – bmcentee148 2014-10-01 04:52:40

1
Parent foo = new Child(); 

当您稍后意识到有更好的孩子可以使用时,优势就会起作用。因此,在不改变任何其他的代码,你可以用你的更好的儿童:

Parent foo = new BetterChild(); 

BetterChild显然应该是Parent

相关问题