我已经有很长时间的问题,与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引用新的对象/变量或实际的类名是否重要? 另外,所选的引用类型如何影响程序和代码?像“对象”这样的某个引用类型会占用更少的内存还是使程序更有效率? 提前致谢
答案 0 :(得分:3)
问题是,我是否使用Object引用新的对象/变量或实际的类名是否重要?
是的,确实如此。如果您使用通用接口/类名作为参考,它将允许您使用动态分派,这意味着将客户端代码与具体实现分离。
我们假设您有Cat
和Dog
个类,这些类扩展了Animal
类。这两个类都覆盖了makeNoise()
方法。然后你可以写一个代码:
Animal animal = animalFactory.getAnimal();
animal.makeNoise();
这不依赖于动物的具体实现:无论您需要什么,它都可以是Dog
或Cat
。这种方法的优点是您的代码不易发生变化。更少的变化 - >少虫子。
但重要的是要提到,您只能调用在变量类型中声明的方法。因此,如果您的变量为Object
类型,则只能调用Object
种方法。
答案 1 :(得分:0)
因为public class Parent{}
与
public class Parent extends java.lang.Object {
}
编译器添加" extends java.lang.Object"如果你没有指定任何超类型。
答案 2 :(得分:0)
澄清:
Class Object是类层次结构的根。每个类都有Object作为超类。所有对象(包括数组)都实现此类的方法。
就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。