我对Java中对象的以下声明感到困惑。对于前:
我需要为ClassName
我可以用两种方式做到:
Object obj = new ClassName();
ClassName obj1 = new ClassName();
此obj
和obj1
之间的主要区别是什么?或者它们是相同的?
答案 0 :(得分:2)
Object是ClassName的超类,事实上,它是您创建的所有类中最顶级的类。 Java允许您使用子类,就好像它是超类的实例(它具有相同的方法,尽管它们可能被覆盖)。
区别在于如何使用它们。在第一种情况下,编译器将obj视为Object类型的引用,并且引用实际上指向ClassName类型的实例。在第二种情况下,编译器将obj1视为ClassName类型的引用,引用指向ClassName类型的实例。
在第一种情况下,您无法调用子类中声明的任何方法,因为Object类型实际上并不包含这些方法(并且编译器不会对它们有所了解) ),而您可以使用第二种方法来调用方法并访问子类中声明的字段。
答案 1 :(得分:1)
Object obj = new ClassName();
您创建了obj
类型的引用Object
,并将其引用到ClassName
个实例。
ClassName obj1 = new ClassName();
,此处创建的对象和引用均为ClassName
类型。
答案 2 :(得分:1)
我建议在Oracle的官方Java教程中阅读(动态)多态性的概念。