当前位置: 首页 > 知识库问答 >
问题:

为什么我们要为Java中的子对象分配父引用?

唐炜
2023-03-14

我在问一个很简单的问题,但我有点困惑。

假设我有一个类parent:

public class Parent {

    int name;
}

并具有另一个类child:

public class Child extends Parent{

    int salary;
}

最后是我的Main.java类

public class Main {

    public static void main(String[] args)
    {
        Parent parent = new Child();
        parent.name= "abcd";
    }
}

如果我将子对象创建为

Child child = new Child():

child对象可以访问name和salary变量。

我的问题是:

Parent parent = new Child();

仅提供父类的name变量的访问权限。那么这条线的确切用途是什么??

 Parent parent = new Child();

并且当它使用动态多态性时,那么为什么在这样做之后,child类的变量是不可访问的

Parent parent = new Child();

共有1个答案

井旺
2023-03-14

首先,对术语进行澄清:我们将child对象赋给parent类型的变量。parent是对一个对象的引用,该对象恰好是parent的子类型,即child

它只在更复杂的示例中有用。假设您将GetEmployeeDetails添加到类父级:

public String getEmployeeDetails() {
    return "Name: " + name;
}

我们可以在child中重写该方法以提供更多详细信息:

@Override
public String getEmployeeDetails() {
    return "Name: " + name + " Salary: " + salary;
}

现在,您可以编写一行代码来获取任何可用的详细信息,不管对象是还是:

parent.getEmployeeDetails();

以下代码:

Parent parent = new Parent();
parent.name = 1;
Child child = new Child();
child.name = 2;
child.salary = 2000;
Parent[] employees = new Parent[] { parent, child };
for (Parent employee : employees) {
    employee.getEmployeeDetails();
}

将得到输出:

Name: 1
Name: 2 Salary: 2000

我们使用作为。它具有child类所特有的特殊行为,但是当我们调用getEmployeeDetails()时,我们可以忽略差异,而关注parentchild是如何相似的。这被称为亚型多态性。

您更新的问题询问当对象存储在引用中时,为什么不能访问child.salary。答案是“多态性”和“静态类型化”的交集。因为Java是在编译时静态类型化的,所以您可以从编译器得到一定的保证,但是您必须在交换中遵循规则,否则代码将无法编译。在这里,相关的保证是子类型(例如child)的每个实例都可以用作其超类型(例如parent)的实例。例如,当您访问Employee.GetEmployeeDetailsEmployee.Name时,可以保证在任何非空对象上定义方法或字段,这些对象可以分配给类型为Parent的变量Employee。为了保证这一点,编译器在决定您可以访问什么时只考虑静态类型(基本上是变量引用的类型parent)。因此无法访问在对象的运行时类型child上定义的任何成员。

当您真正想将用作时,这是一个很容易接受的限制,您的代码将可用于及其所有子类型。如果不能接受,请将引用的类型设为child

 类似资料:
  • 我想了解将父对象引用设置为子对象的用例。示例:Dog类扩展了Animal类。(请注意,没有接口)我通常会创建一个Dog对象,如下所示: 现在,因为Dog是动物的一个子类,它已经可以访问动物的所有方法和变量。那么,这有什么区别: 请提供一个适当的用例及其使用的代码片段。请不要写关于“多态性”或“接口编码”的理论文章! 代码: 两种情况下的输出相同。那么为什么我们要将父引用设置为子对象呢?

  • 问题内容: 我知道弱引用是垃圾收集器的摆布,我们不能保证弱引用会存在。我认为没有必要提供较弱的参考,但可以确定应该有一个理由。 为什么我们需要Java中的弱引用? Java中弱引用的实际(某些)用法是什么?如果您可以分享您在项目中的使用方式,那就太好了! 问题答案: 使用弱哈希图实际上通常是一个坏主意。首先,很容易出错,但更糟糕的是,它通常用于实现某种缓存。 这意味着以下内容:您的程序在一段时间内

  • 考虑类家长: 和类儿童: 如果我在应用程序中创建一个新的子对象,并将其放入父对象的children字段中,然后持久化父对象,为什么Hibernate不自动更新子对象的Parent字段(以便设置parentID列)?

  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 假设我在程序中有一段代码: 有人建议我在调用消息之前检查消息的空值。getUserId()。 检查null有两种方法:第一种: 第二种方式: 我的问题是: 哪种方式对null检查更好?返回还是抛出异常? 为什么我们在这里需要空检查?如果我们不这样做,那么无论如何都会抛出。