我在问一个很简单的问题,但我有点困惑。
假设我有一个类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();
首先,对术语进行澄清:我们将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()
时,我们可以忽略差异,而关注parent
和child
是如何相似的。这被称为亚型多态性。
您更新的问题询问当子
对象存储在父
引用中时,为什么不能访问child.salary
。答案是“多态性”和“静态类型化”的交集。因为Java是在编译时静态类型化的,所以您可以从编译器得到一定的保证,但是您必须在交换中遵循规则,否则代码将无法编译。在这里,相关的保证是子类型(例如child
)的每个实例都可以用作其超类型(例如parent
)的实例。例如,当您访问Employee.GetEmployeeDetails
或Employee.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检查更好?返回还是抛出异常? 为什么我们在这里需要空检查?如果我们不这样做,那么无论如何都会抛出。