使用对象变量引用新数据 types/objects

Using Object variables to reference new data types/objects

关于 Java 语法及其允许这样做的原因,我一直有一个紧迫的问题:

Object object1 = new Integer();

为什么我们可以使用 Object 作为引用来声明子 classes? 另外,我们来看看这段代码:

public class Parent{}    
public class Child extends Parent{}

public static void main(String[] args){
   Parent var1 = new Child();                
   Object var2 = new Child();
   Object var3 = new Parent();                
}

所有三种情况都会 运行,因为我已经尝试过了。问题是,我使用 Object 来引用新的 object/variable 还是实际的 class 名称有关系吗? 另外,选择的引用类型如何影响程序和代码?像"Object"这样的某个引用类型是占用更少的内存还是让程序更有效率? 提前致谢

因为public class Parent{}

完全一样
public class Parent extends java.lang.Object {
}

如果您没有指定任何超类型,编译器会添加 "extends java.lang.Object"。

澄清一下:

Class 对象是 class 层次结构的根。每个 class 都有 Object 作为一个 superclass。所有的对象,包括数组,都实现了这个class.

的方法

作为Oracle Doc

就 OOP 而言,称为 type polymorphism,举例来说:

如果 S 是 T 的子类型,则子类型关系通常写为 S <: T,这意味着任何类型 S 的术语都可以安全地用于预期类型 T 的上下文中作为此 WIKI 说。

因为任何数据类型子类型都可以分配给对象实例

The question is, does it matter whether I use Object to reference a new object/variable or the actual class name?

是的,确实如此。如果您使用通用的 interface/class 名称作为参考,它将允许您使用 动态调度 ,这意味着将客户端代码与具体实现分离。 假设您有 CatDog class 扩展 Animal class。 class 都覆盖了 makeNoise() 方法。那么你可以写一段代码:

Animal animal = animalFactory.getAnimal(); 
animal.makeNoise();

这不依赖于 animal 的具体实现:它可以是 DogCat 任何你需要的。这种方法的优点是您的代码不易更改。更少的变化 -> 更少的错误。 但值得一提的是,您只能调用在变量类型中声明的方法。因此,如果您的变量是 Object 类型,则只能调用 Object 方法。

就效率而言,我认为这没有任何区别,因为无论如何您都有该对象类型的实例。

使用它的主要优点可能是实现多态性。例如

Object var1 = new GrandParent();                
Object var2 = new Child();
Object var3 = new Parent();
List<Object> object_list = new ArrayList<>();
object_list.add(var1);
object_list.add(var2);
object_list.add(var3);

当然这没有多大意义,因为你不会有任何优势。但是,如果您使用 Interface,则可以在不指定类型的情况下调用方法。像这样:

IPerson var1 = new GrandParent();                
IPerson var2 = new Child();
IPerson var3 = new Parent();
List<IPerson > object_list = new ArrayList<>();
object_list.add(var1);
object_list.add(var2);
object_list.add(var3);

for(IPerson person : object_list) {
    person.laugh();
}

在这种情况下,您可以在每个混凝土中应用不同的算法 class。 这是一个Strategy Design Pattern.