使用Object变量引用新数据类型/对象

时间:2017-06-09 22:20:51

标签: java oop reference-type

我已经有很长时间的问题,与Java语法有关,以及为什么允许这样做:

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作为参考来声明子类? 另外,让我们来看看这段代码:

fuzzyjoin

我试过这三个案例都会运行。问题是,我是否使用Object引用新的对象/变量或实际的类名是否重要? 另外,所选的引用类型如何影响程序和代码?像“对象”这样的某个引用类型会占用更少的内存还是使程序更有效率? 提前致谢

4 个答案:

答案 0 :(得分:3)

  

问题是,我是否使用Object引用新的对象/变量或实际的类名是否重要?

是的,确实如此。如果您使用通用接口/类名作为参考,它将允许您使用动态分派,这意味着将客户端代码与具体实现分离。 我们假设您有CatDog个类,这些类扩展了Animal类。这两个类都覆盖了makeNoise()方法。然后你可以写一个代码:

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

这不依赖于动物的具体实现:无论您需要什么,它都可以是DogCat。这种方法的优点是您的代码不易发生变化。更少的变化 - >少虫子。 但重要的是要提到,您只能调用在变量类型中声明的方法。因此,如果您的变量为Object类型,则只能调用Object种方法。

答案 1 :(得分:0)

因为public class Parent{}

完全相同
public class Parent extends java.lang.Object {
}

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

答案 2 :(得分:0)

澄清:

Class Object是类层次结构的根。每个类都有Object作为超类。所有对象(包括数组)都实现此类的方法。

作为Oracle Doc

就OOP而言,type polymorphism称为template <typename T> struct value_holder { T value; static const bool is_integer = ??; // if T is int or long set this to true, else set false } ,意思是:

如果S是T的子类型,则子类型关系通常写为S&lt;:T,意味着任何类型S的术语都可以安全地用于期望类型为T的术语中。{{{ 3}}说。

因此可以将任何数据类型子类型分配给Object实例

答案 3 :(得分:0)

就效率而言,我认为它没有任何区别,因为你有对象类型的实例。

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

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);

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

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();
}

在这种情况下,您可以在每个具体类中应用不同的算法。 这是Strategy Design Pattern