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

Java 使用对象变量引用新的数据类型/对象,java,oop,reference-type,Java,Oop,Reference Type,很长一段时间以来,我一直有一个紧迫的问题,关于Java语法以及它为什么允许这样做: Object object1 = new Integer(); 为什么我们可以使用对象作为引用来声明子类? 另外,让我们来看看这段代码: public class Parent{} public class Child extends Parent{} public static void main(String[] args){ Parent var1 = new Child();

很长一段时间以来,我一直有一个紧迫的问题,关于Java语法以及它为什么允许这样做:

Object object1 = new Integer();
为什么我们可以使用对象作为引用来声明子类? 另外,让我们来看看这段代码:

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”这样的引用类型占用更少的内存还是使程序更高效?
提前感谢

,因为
公共类父{}

public class Parent extends java.lang.Object {
}
如果未指定任何超级类型,编译器将添加“extends java.lang.Object”。

如需澄清:

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

作为

就OOP而言,它被称为
类型多态性
,举例来说,这意味着:

如果S是T的一个子类型,子类型关系通常写为S 问题是,使用Object引用新对象/变量还是实际的类名重要吗

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

Animal animal = animalFactory.getAnimal(); 
animal.makeNoise();
这并不依赖于动物的具体实现:它可以是
任何你需要的东西。这种方法的优点是代码不太容易更改。更少的更改->更少的bug。
但需要注意的是,您只能调用变量类型中声明的方法。因此,如果您的变量是
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);
Object var1=新祖父母();
Object var2=新的子对象();
Object var3=新的父对象();
List 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();
}
IPerson var1=新祖父母();
IPerson var2=新子级();
IPerson var3=新父级();
List object_List=new ArrayList();
object_list.add(var1);
object_list.add(var2);
object_list.add(var3);
对于(个人:对象列表){
人。笑();
}
在这种情况下,您可以在每个具体类中应用不同的算法。
这是一个.

但引用类型对编程有什么影响?对象引用是否比父引用占用更多内存和计算能力?还是将所有东西声明为对象只是糟糕的编程?提前感谢将所有内容都变成
对象
,(引用类型对内存、计算能力、效率或任何其他方面没有影响)
对象没有很多公共方法。是的,这很重要,您不能使用var2、var3访问子类或父类方法。编译器不会让它发生。实际对象将始终保持不变,无论您使用哪种类型来访问它。所以
objectobj=newperson()不会转换为对象,它始终是Person类型的对象。你只是看不到人的方法。