Java 在类对象的引用类型和父类引用类型中对其进行HOD有什么区别
我有这三节课Java 在类对象的引用类型和父类引用类型中对其进行HOD有什么区别,java,Java,我有这三节课 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
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:在父类引用中保留对象时
==>那么我们只能调用java中类中被重写的方法,如果可能的话,我们鼓励您使用具体类型正在实现的超级类型或接口。这将使代码与类的实际实现分离 例如:假设您正在编写视频游戏的主循环。在这里,您可以使用
敌方
接口编写代码,该接口有一些方法(碰撞()
,射击()
,决断移动()
,等等)。一旦您用这个接口编写了主循环,它将永远保持原样;但是,您可以通过添加新的敌方
界面(敌我
,敌我怪物
,敌我降落伞
,等等)来扩展您的视频游戏,但您将永远不需要修改主循环
这是面向对象编程的设计原则:
变量“childObjParentdRef”只是持有对Xyz实例的引用,因此,如果您碰巧调用了它的方法“methAbc”,那么您正在调用Xyz中被重写的方法,尽管您的变量类型是Abc
因此,重要的是要知道,您实例化的“超级类型/类”的“方法/行为”将“始终”由编译器调用,即使您将对象“装箱”到其“基类型/类”中
同样适用于C#。不同于
Xyz childObjChildRef=new Xyz()代码>和Abc childObjParentdRef=new Xyz()代码>是指在第一个代码语句中,您正在创建类的对象Xyz
,并将其分配给子类引用变量。因此,您可以调用子类中存在的所有方法,包括从父类继承的方法。而在第二个代码语句中,您正在创建类的对象Xyz
,并将其分配给父类类引用,因此您有资格调用由子类继承或重写的父类方法。您不能调用未通过使用父类引用继承的子类方法
另外,如果您希望在代码中保持松散耦合,则主要使用父类引用或接口。为什么不尝试使用父类引用调用子类的方法??。。你会知道答案的…@TheLostMind:使用父母参考我不能称之为子方法技术细节的一部分(调用哪个方法),你应该知道对象树背后的想法。一个很好的例子是集合
及其子类型。如果将对象称为集合
,则只需看到该接口的方法,即可以添加
和获取
项等,但不关心其他细节(例如,它是数组列表
、是哈希集
还是其他)。TL;DR:它简化了编程。请参阅。。。通过使用父类的引用,您只能调用父类的方法(如果在子类中重写,则将调用子类的方法…)。。关键是,即使父类引用引用了childClass对象,也只有“引用类的方法可见”。。这是你因过于笼统而付出的惩罚(下面的@Jorge_B很好地解释了这一点:)