2

我对将实例声明为特定类型的目的有点困惑。例如,

Integer intOb1 = new Integer(3);
Object intOb2 = new Integer(4);

我知道 is 的类型和isintOb1Integer类型,但是声明为允许做什么?使用方法?您不能将这些方法用作吗?或者主要目的只是为了能够“对待”作为一个对象?intOb2ObjectintOb2ObjectObjectIntegerintOb2

如你所见,我很困惑。

4

3 回答 3

2

Object涉及时,您永远不会得到任何有用的东西,因为它是一种在任何地方都无济于事的泛型类型。

但想想另一种情况:

List<String> list = new ArrayList<String>();

这意味着特定的东西:listis anArrayList并声明它只是泛型List集合会强制执行这样一个事实,即在整个代码中您不会使用任何ArrayList特定方法。

这有效地允许您声明您不会依赖任何特定的实现,您稍后将被允许切换ArrayList<String>()到,例如,LinkedList<String>()而无需修改任何其他内容。

于 2012-04-13T03:30:17.437 回答
2

这个实际不称为强制转换,这是多态性的一个例子。这允许变量根据它们与其他类的继承关系采取不同的类型。

例如,假设您正在编写一个程序来模拟动物园。您将有一个名为的类Zoo和一个名为Animal. 还有几个从该类扩展而来的Animal类:LionZebraElephant

将所有这些对象组合在一个列表中会非常有用,但由于它们属于不同类型,即:Lion、、ZebraElephant,您不能将它们存储在一个列表中,您必须维护一个单独的列表对于每种动物。这就是多态性发挥作用的地方。

由于每个类Lion,ZebraElephant所有类都扩展自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);
   }
}

希望这会有所帮助,即使是一个愚蠢的例子。

于 2012-04-13T03:43:22.087 回答
0

您始终可以从任何类型的类的对象中使用“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 引入了称为泛型的新功能。

于 2012-04-13T03:43:45.803 回答