Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类对象的引用类型和父类引用类型中对其进行HOD有什么区别_Java - Fatal编程技术网

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很好地解释了这一点:)