我有这三个类
public class Abc
{
public methAbc()
{
System.out.println("parent class method");
}
}
public class Xyz extends Abc
{
public methAbc()
{
System.out.println("overriden parent class method");
}
public methXyz()
{
System.out.println("child class method");
}
}
class Pqr
{
Xyz childObjChildRef = new Xyz();
Abc childObjParentdRef = new Xyz();
}
班级Pqr 在不同的参考文献中创建对象的主要区别是什么
1:将对象保持在同一个类引用中 ==>然后我们可以调用类
中的所有方法2:在父类引用中保存对象时 ==>那么我们只能调用类
中的重写方法答案 0 :(得分:4)
在java中,如果可能,建议您使用您的具体类型正在实现的超类型或接口。这将您的代码与类的实际实现分离。
例如:假设您正在编写视频游戏的主循环。在那里,您使用Enemy
界面编写代码,该界面包含一些方法(collide()
,shoot()
,decideNextMovement()
等。一旦你用这个界面编写了你的主循环,它就会永远保持原样;但是,您可以随时通过添加Enemy
界面(EnemyShip
,EnemyMonster
,EnemyParachuter
等)的新实现来扩展您的视频游戏,但您将从不因此需要修改主循环。
这是面向对象编程的设计原则:
答案 1 :(得分:2)
变量“childObjParentdRef”只是持有对Xyz实例的引用,因此,如果您碰巧调用其方法“methAbc”,则在Xyz中调用重写方法,尽管您的变量类型为Abc。
因此,重要的是要知道您实例化的“超类型/类”的“方法/行为”将始终是编译器调用的“方法/行为”,即使您将对象“装箱”到其“基础”类型/类别“。
在C#中也一样。
答案 2 :(得分:2)
Xyz childObjChildRef = new Xyz();
和Abc childObjParentdRef = new Xyz();
之间的区别在于,在第一个代码语句中,您正在创建类Xyz
的对象并分配给子类引用变量。因此,您可以调用所有存在的方法在Child类中,包括来自Parent类的继承方法。在第二个代码语句中,您正在创建类Xyz
的对象并将其分配给父类引用,因此您有资格调用由子类继承或覆盖的父类方法。您不能使用父类引用来调用未继承的子类方法
此外,如果您想在代码中维护松散耦合,那么主要使用Parent类引用或接口。