gpt4 book ai didi

java - 继承的方法可以访问Java中的子类字段吗

转载 作者:行者123 更新时间:2023-11-29 06:32:12 26 4
gpt4 key购买 nike

我无法理解继承。在下面的代码中,为什么继承的方法没有访问子类中的字段?有什么方法可以在不覆盖继承方法的情况下访问子类字段?

class Fish {
private String fishType = "Fish";
public String getFishType() {
return fishType;
}
}

class Marlin extends Fish {
private String fishType = "Marlin";
}

public class InheritanceTest {
public static void main(String[] args) {
Fish fish1 = new Fish();
Fish marlin1 = new Marlin();
System.out.println(fish1.getFishType());
System.out.println(marlin1.getFishType());
}
}

这段代码打印

Fish
Fish

但我很期待

Fish
Marlin

似乎每个人都基于私有(private)字符串来回答,但即使我将字段更改为公共(public)字段,我仍然遇到问题。问题不在于继承私有(private)字段。

请查看下面更新的代码。

class Fish {
public String fishType = "Fish";
public String getFishType() {
return fishType;
}
}

class Marlin extends Fish {
public String fishType = "Marlin";
}

public class InheritanceTest {
public static void main(String[] args) {
Fish fish1 = new Fish();
Marlin marlin1 = new Marlin();
System.out.println(fish1.getFishType());
System.out.println(marlin1.getFishType());
}
}

输出和我的期望与上面相同。

最佳答案

首先,私有(private) 的字段(和方法)不会 被继承。您的 Marlin 类甚至不知道其父字段。

其次,Java 将根据您在运行时使用的实例选择最合适的方法来调用。由于 Marlin 没有定义方法 getFishType,它将使用其父类的方法。

您可以采用多种方法来解决这个问题;其中之一是重写 Marlin 中的 getFishType 方法:

@Override
public String getFishType() {
return fishType;
}

使用新代码,您实际上是 hiding the variable通过在 Marlin 中重新声明它。

If the class declares a field with a certain name, then the declaration of that field is said to hide any and all accessible declarations of fields with the same name in superclasses, and superinterfaces of the class.

这很容易通过不重新声明变量来解决;相反,在构建时分配您想要的值。

public Marlin() {
fishType = "Marlin";
}

或者,为了保持代码更简洁,您可以通过使用父类的方法而不是在子类中覆盖它的方式来重构您的类。这确实需要父类中的几个构造函数。

class Fish {
private final String fishType;

// Default constructor; used in nominal cases
public Fish() {
this("Fish");
}

// Constructor used to populate the fishType field
public Fish(final String fishType) {
this.fishType = fishType;
}

public String getFishType() {
return fishType;
}
}

class Marlin extends Fish {
public Marlin() {
super("Marlin"); // invoke super's constructor
}
}

再一次,由于 Marlin 中没有合适的方法 getFishType,它将查找 Fish 类并改用它的方法。然而,这一次,我们真正想要实现的值(value)是我们期望的值(value)。

关于java - 继承的方法可以访问Java中的子类字段吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com