我想知道在从另一个类扩展的类中创建对象的这两种方法之间是否存在任何功能差异。
我只是在处理基本的继承,除了Cat之外没有任何复杂的事情可以扩展哺乳动物等等。
答案 0 :(得分:2)
ParentClass objectName = new SubClass()
- 父类引用持有子类对象
class ParentClass{
void m1(){
System.out.println("parent m1");
}
void m2(){
System.out.println("parent m2");
}
}
class SubClass extends ParentClass{
//subclass overriding parent class m1 method
@Override
void m1(){
System.out.println("child m1");
}
void m3(){
System.out.println("child m3");
}
}
class Test{
public static void main(String[] args){
ParentClass p = new SubClass();
p.m1();// out puts child m1 as child class is overriding m1 method
p.m2();//out puts parent m2 as child class is not overriding m2 method
p.m3();//gives compile time error as parent class reference doesn't know about m3 method
}
}
答案 1 :(得分:2)
这取决于你想做什么:
ParentClass objectName = new SubClass()
通常在您只需要ParentClass
的功能时使用,而不关心实际的实现SubClass
。一个突出的例子是诸如List
之类的容器,其中一个例如List<String> objectName = new ArrayList<String>()
。 Mammal
。人们需要的是一个列表,在代码的其余部分通常不关心列表的实现方式。在您的情况下,如果您需要的只是Dog
的功能,那么您可以使用此功能,并且您的代码也可以在您希望与Cat
而不是SubClass objectName = new SubClass()
一起使用的那一天使用。本着泛化的精神,你总是可以尝试使用最通用的类型(最古老的祖先)。一些集成开发环境实际上有一个函数来尝试用最通用的类型替换变量类型,这种类型不会破坏代码。
SubClass
允许您在其余代码中使用SubClass
的所有详细信息,而无需进行任何类型转换(原则上可能会失败)如果代码的某些部分分配了一个不是{{1}}或其后代的不同对象。
答案 2 :(得分:1)
new SubClass()
返回的实例不受您为其分配的引用类型的影响 - 运行相同的构造函数,并返回具有相同功能的对象。
将此新创建的对象分配给层次结构中的高级参考通常用于表示您不会使用任何SubClass
特定方法,并且您的代码不会被限制为假设什么子类你正在使用。
答案 3 :(得分:1)
ParentClass objectName = new SubClass() // use only when you need some features of parent class.
1)。 objectName(父类的引用)具有Subclass的对象。
2)。在这种情况下,您可以访问父类的公共方法,但无法访问子类的方法。
SubClass objectName = new SubClass() // use only when you need features of subclass.
1)。在两种情况下创建的对象都是相同的。
2)。你可以访问它们(超类和子类的方法)。
答案 4 :(得分:0)
第一个语句引用ObjectName1是指子类,其中第二个ObjectName2引用自己的对象,如果调用父对象的方法,它将调用子类对象的方法,如果它存在