在实例化(子)类时,您声明对象的"类型"是否有任何区别?

DSF*_*DSF 2 java inheritance subclass instantiation

假设我有一个被调用ParentClass的类和一个被调用的类ChildClass

ParentClass是抽象的,并ChildClass扩展了ParentClass每个Java术语.此外,它ParentClass有一个构造函数,它以int一个参数为参数.现在在另一个类中我想实例化ChildClass.我尝试了以下两种方式:

  1. ChildClass obj1 = new ChildClass(5)
  2. ParentClass obj2 = new ChildClass(5)

Java允许我使用上述两种方法中的任何一种.我的问题是,实际上有什么区别吗?如果我愿意,可以互换使用这两种吗?

xle*_*ier 5

两者都有效,并且都在内存中创建相同的对象.但只有第一个允许您使用ChildClass其他特定的属性或ParentClass不知道的方法.

示例:

abstract class ParentClass{
   ...
}

class ChildClass extends ParentClass {

   public void SomeChildMethod(){ ... }
   ...
}

...


ChildClass obj1 = new ChildClass(5);
ParentClass obj2 = new ChildClass(5);

obj1.SomeChildMethod(); // ok
obj2.SomeChildMethod(); // compilation error 
((ChildClass)obj2).SomeChildMethod(); // ok
Run Code Online (Sandbox Code Playgroud)

因此,只有在您确定永远不需要特定的子方法或属性(如果有)时,才使用第二个实例化方法.