gpt4 book ai didi

java - 我可以从未被子类覆盖的方法内部访问子对象的字段吗?

转载 作者:行者123 更新时间:2023-12-02 10:56:53 25 4
gpt4 key购买 nike

我正在尝试用java实现“太空挑战”程序。

请参阅底部的编辑以获得更清晰的信息

说明要求您编写 Rocket 类以及子类 U1 和 U2。

子类具有特定于这些的字段,即 RocketWeight 和 maxWeight。对于每个子类,它们的值必须不同。

父类Rocket有一个方法canCarry,需要检查火箭的重量。此方法由 U1 和 U2 继承,但未重写。

然后我调用 canCarry 方法,例如u1.canCarry(arguments),其内部的方法查看变量 this.rocketWeight 和 this.maxWeight,但我已经检查过,而不是具有值 u1.rocketWeight 和 u1.maxWeight (正如我希望它们具有的那样),它们的值为 0。

我认为我的问题是我不知道如何从父类的方法内部访问子对象的变量。

这是对该方法的调用。对象 u1 属于类 U1,它是 Rocket 的子类:

u1.canCarry(itemList.get(i))

itemList.get(i) 是一个具有字段权重的对象

这是方法本身,在 Rocket 类中声明:

@Override
public boolean canCarry(Item item) {
return ((this.weightRocket + item.weight) < this.maxWeight);
}

如果我在方法中打印 this.weightRocket 和 this.maxWeight,两者都是 0。在方法之外两者都有预期值。 item.weight 也具有我期望的值。

我确信这是非常基本的东西,我一周前才开始使用 java。

谢谢

编辑:下面的评论让我知道没有足够的代码,因此我查看了提出问题的最佳实践。

接下来的代码片段显示了我正在尝试做的事情的简化版本。

Rocket.java:包含一个方法 canCarry

public class Rocket {

int maxWeight;

boolean canCarry(int itemWeight){
return itemWeight < this.maxWeight;
}

}

U1.java:设置该子类的对象的maxWeight值

public class U1 extends Rocket {

int maxWeight = 18;

}

U2.java:与U1相同

public class U2 extends Rocket{

int maxWeight = 23;

}

Main.java:为U1和U2类的对象调用canCarry方法。我希望 canCarry 方法中的 maxWeight 值是在子类中定义的值,但它使用父类中的值,尽管对象 u1 和 u2 属于类 U1 和 U2。

public class Main {

public static void main(String[] args) {

int itemWeight = 20;

U1 u1 = new U1();
U2 u2 = new U2();

if(u1.canCarry(itemWeight)){
System.out.println("Launch rocket 1!");
} else {
System.out.println("Rocket 1 can't launch");
}

if(u2.canCarry(itemWeight)){
System.out.println("Launch rocket 2!");
} else {
System.out.println("Rocket 2 can't launch");
}

}
}

从问题的描述看来我应该这样做。

问题:https://classroom.udacity.com/courses/ud283/lessons/2b5bc57f-de73-45a4-b3a7-8dcc8da2f178/concepts/b8b57dc5-2eb8-4834-8e96-4956fc322f50

逐字记录:创建一个类 Rocket (...) Carry 和 canCarry 应该在此处实现,并且不需要在 U1 和 U2 类中重写。

知道如何处理这个问题吗?

谢谢

编辑:这与为每个类创建构造函数有关吗?我没有这样做,但我知道如果你不这样做,java 就会创建一个默认构造函数

最佳答案

我解决了我自己的问题。我必须为构造函数中的字段赋予值。

这是按预期工作的代码:

Rocket.java

public class Rocket {

int maxWeight;

Rocket(){
maxWeight = 0;
}

boolean canCarry(int itemWeight){
return itemWeight < this.maxWeight;
}

}

U1.java:

public class U1 extends Rocket {

U1() {
maxWeight = 18;
}

}

U2.java:

public class U2 extends Rocket{

U2() {
maxWeight = 23;
}

}

Main.java:

public class Main {

public static void main(String[] args) {

int itemWeight = 20;

U1 u1 = new U1();
U2 u2 = new U2();

if(u1.canCarry(itemWeight)){
System.out.println("Launch rocket 1!");
} else {
System.out.println("Rocket 1 can't launch");
}

if(u2.canCarry(itemWeight)){
System.out.println("Launch rocket 2!");
} else {
System.out.println("Rocket 2 can't launch");
}

}
}

关于java - 我可以从未被子类覆盖的方法内部访问子对象的字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661082/

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