我对将实例声明为特定类型的目的感到困惑。例如,
Integer intOb1 = new Integer(3);
Object intOb2 = new Integer(4);
我知道intOb1
的类型为Integer
,intOb2
的类型为Object
,但将intOb2
声明为Object
的内容是什么允许一个人做?使用Object
中的方法?你不能将这些方法用作Integer
吗?或者,主要目的是将“{1}}”视为对象?
如你所见,我迷糊了。
答案 0 :(得分:2)
当涉及Object
时,你永远不会得到任何有用的东西,因为它是一种在任何地方都无济于事的通用类型。
但想想不同的情况:
List<String> list = new ArrayList<String>();
这意味着具体的内容:list
是ArrayList
,并声明只是通用的List
集合强制执行以下事实:在整个代码中,您不会使用任何ArrayList
具体方法。
这有效地允许您声明您不会依赖任何特定实现,稍后您将被允许将ArrayList<String>()
切换为LinkedList<String>()
,而不必修改任何其他内容。< / p>
答案 1 :(得分:2)
这个实际不叫做cast这是多态的一个例子。这允许变量根据与其他类的继承关系采用不同的类型。
例如,假设您正在编写一个程序来模拟动物园。您将拥有一个名为Zoo
的类和一个名为Animal
的类。还有几个类从Animal
类扩展而来:Lion
,Zebra
和Elephant
。
将所有这些对象组合在一起放在一个列表中非常有用,但由于它们的类型不同,即:Lion
,Zebra
和Elephant
,无法将它们存储在单个列表中,您必须为每种类型的动物维护一个单独的列表。这就是多态性发挥作用的地方。
由于每个类Lion
,Zebra
和Elephant
都来自Animal
类,我们只需将它们存储在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);
}
}
希望这有帮助,即使有一个愚蠢的例子。
答案 2 :(得分:0)
您始终可以从任何类型的对象使用“Object”类的方法,因为所有类都是“Object”的子类
相反,你需要理解为什么有人创建类型为Object的对象:
当您想要编写某些方法/功能并且您不确定哪种类型的对象可能作为输入时,通常需要类型转换。 JDK中最常见的一个例子是比较器中的equals方法或比较方法。
// 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引入了一个名为generic的新功能。