阅读:http://www.javaranch.com/campfire/StoryCups.jsp
然后阅读它的后续:http://www.javaranch.com/campfire/StoryPassBy.jsp
但基本上,你需要给它一个类型,以便编译器知道它是那个类型。请注意,您也可以这样做,这基本上就是您所说的:
Object dogObj = new Dog();
但是你只能在该变量上使用 Object 中定义的方法,因为编译器无法保证某个 Object 是否是更具体的类型。
编辑:假设您有两个类,Dog 和 Cat。 Dog 有 bark() 方法,Cat 有 meow() 方法。
你可以这样做,因为正如你所说,参考就是参考:
Object dog = new Dog();
但是,你将无法做到这一点:
dog.bark();
即使 Dog 类有一个 bark() 方法,并且 dog 变量是 Dog 的一个实例,编译器并不知道这一点。事实上,编译器无法知道什么。毕竟,你也可以这样做:
Object dog = new Dog();
dog = new Cat();
dog.bark(); //good thing this is a compiler error!
您可能会想,为什么编译器无法解决这个问题?原因是这样的代码可能会发生:
Object dog = new Dog();
if(Math.random() < .5){
dog = new Cat();
}
//what type is dog now??
所以编译器只能保证一个Object就是变量的类型。这就是为什么你需要给每个变量一个类型。
请注意,您还可以强制转换变量以明确告诉编译器某物是什么类型:
Object dog = new Dog();
dog = new Cat();
((Cat)dog).meow(); //this will now work, since the compiler knows dog is a Cat!
但要小心,因为如果你错了,你会得到一个运行时错误:
Object dog = new Dog();
dog = new Cat();
((Dog)dog).bark(); //this won't work, since dog is actually a Cat!
我强烈建议将您自己的运行与这些示例类似的代码的小测试程序放在一起,这样您就可以更好地了解正在发生的事情。