我对将实例声明为特定类型的目的有点困惑。例如,
Integer intOb1 = new Integer(3);
Object intOb2 = new Integer(4);
我知道 is 的类型和isintOb1
的Integer
类型,但是声明为允许做什么?使用方法?您不能将这些方法用作吗?或者主要目的只是为了能够“对待”作为一个对象?intOb2
Object
intOb2
Object
Object
Integer
intOb2
如你所见,我很困惑。
当Object
涉及时,您永远不会得到任何有用的东西,因为它是一种在任何地方都无济于事的泛型类型。
但想想另一种情况:
List<String> list = new ArrayList<String>();
这意味着特定的东西:list
is anArrayList
并声明它只是泛型List
集合会强制执行这样一个事实,即在整个代码中您不会使用任何ArrayList
特定方法。
这有效地允许您声明您不会依赖任何特定的实现,您稍后将被允许切换ArrayList<String>()
到,例如,LinkedList<String>()
而无需修改任何其他内容。
这个实际不称为强制转换,这是多态性的一个例子。这允许变量根据它们与其他类的继承关系采取不同的类型。
例如,假设您正在编写一个程序来模拟动物园。您将有一个名为的类Zoo
和一个名为Animal
. 还有几个从该类扩展而来的Animal
类:Lion
、Zebra
和Elephant
。
将所有这些对象组合在一个列表中会非常有用,但由于它们属于不同类型,即:Lion
、、Zebra
和Elephant
,您不能将它们存储在一个列表中,您必须维护一个单独的列表对于每种动物。这就是多态性发挥作用的地方。
由于每个类Lion
,Zebra
和Elephant
所有类都扩展自Animal
该类,我们可以简单地将它们存储在 type 列表中Animal
。
代码示例:
public class Zoo
{
private List<Animal> animals;
public Zoo()
{
this.animals = new ArrayList<>();
}
//notice this method takes an Animal object as a parameter
public void add(Animal a)
{
this.animals.add(a);
}
}
public abstract class Animal
{
private String name;
private String type;
public Animal(String name, String type)
{
this.name = name;
this.type = type;
}
//all subclasses must implement this method
public abstract void speak();
}
public class Lion extends Animal
{
private String animalType = "Lion";
public Lion(String name)
{
super(name, animalType);
}
public void speak()
{
System.out.println("ROAR");
}
}
//....etc for the other two animals
public class TestZoo
{
public static void main(String[] args)
{
Zoo myZoo = new Zoo();
Lion l = new Lion("Larry");
Elephant e = new Elephant("Eli");
Zebra z = new Zebra("Zayne");
myZoo.add(l); //<-- note that here I don't pass Animal objects to the
myZoo.add(e); // add method but subclasses of Animal
myZoo.add(z);
}
}
希望这会有所帮助,即使是一个愚蠢的例子。
您始终可以从任何类型的类的对象中使用“Object”类的方法,因为所有类都是“Object”的子类
相反,您需要了解为什么有人会创建 Object 类型的对象:
当您想要编写一些方法/功能并且您不确定哪种类型的对象可以作为输入时,通常需要类型转换。JDK 中最常见的示例之一是比较器中的 equals 方法或 compare 方法。
// Object equals method - written for such generic use.
boolean equals(Object obj) {
//Here you might want to check which is other type of object.
if (!obj instanceof CurrentClass) {
return false;
}
//Additional logic required to check equality of object.
}
早期的 Collection 库(JDK 1.4)也有类似的情况,但 JDK 1.5 引入了称为泛型的新功能。