Java 我可以从未被子类重写的方法内部访问子对象的字段吗?
我正试图用java实现“太空挑战”计划 请参见底部的“编辑”以了解更多信息 说明要求您编写一个类Rocket和子类U1和U2Java 我可以从未被子类重写的方法内部访问子对象的字段吗?,java,Java,我正试图用java实现“太空挑战”计划 请参见底部的“编辑”以了解更多信息 说明要求您编写一个类Rocket和子类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)){
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");
}
}
}
子类具有特定于这些字段的字段,即RocketWight和maxWeight。每个子类的值必须不同
父类火箭有一个方法canCarry,需要检查火箭的重量。此方法由U1和U2继承,但不被重写
然后我调用canCarry方法,例如u1.canCarry(arguments),该方法本身会查看变量this.rocketWeight和this.maxWeight,但我检查了它们的值不是u1.rocketWeight和u1.maxWeight(我希望它们有),而是0
我认为我的问题是,我不知道如何从父类的方法中访问子对象中的变量
这是对该方法的调用。对象u1属于类u1,它是Rocket的子类:
u1.canCarry(itemList.get(i))
get(i)是具有字段权重的对象
这是方法本身,在Rocket类中声明:
@Override
public boolean canCarry(Item item) {
return ((this.weightRocket + item.weight) < this.maxWeight);
}
java:与U1相同
public class U2 extends Rocket{
int maxWeight = 23;
}
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");
}
}
}
从问题的描述来看,我应该这样做
问题是:
逐字:创建一个类Rocket(…)carry和canCarry应该在这里实现,并且不需要在U1和U2类中重写
你知道怎么处理吗
谢谢
编辑:它是否与为每个类创建构造函数有关?我没有这样做,但我知道如果你不这样做,java会创建一个默认构造函数。我解决了我自己的问题。我必须给构造函数中的字段赋值 这是按预期工作的代码: Rocket.java
public class Rocket {
int maxWeight;
Rocket(){
maxWeight = 0;
}
boolean canCarry(int itemWeight){
return itemWeight < this.maxWeight;
}
}
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");
}
}
}
对于超类方法来说,没有(直接的)方法来访问子类字段或方法,但在您的情况下,不需要这样做
您的错误是在子类U1
中引入了一个新字段maxWeight
。这意味着U1实例有两个同名的字段maxWeight
,一个仅对Rocket
类中的方法可见,另一个仅对U1
类中的方法可见
您最好只有一个maxWeight
字段,对Rocket
及其子类可见,并且在U1
和U2
中对其进行不同的初始化。您可以这样做:
public class U1 extends Rocket {
public U1() {
maxWeight = 18;
}
}
public class U2 extends Rocket {
public U2() {
maxWeight = 23;
}
}
然后一切都将按预期工作。将macWeight设置为超级a类受保护整数。在子类中,在收缩器中设置值
public u1 () {
this.maxWeight = 18;
}
等等
更明确、更安全、更有效 为什么不在基类中声明这些字段,而不是在每个子类中声明呢?请阅读。你的问题包含了很多信息,但没有相关的信息:代码。事实上,你不能没有不必要的复杂性。。。因此,除了@DawoodibnKareem已经说过的内容之外,您可能会更仔细地研究Java中的抽象方法以及接口,也许您会重新思考如何处理您的类…@DawoodibnKareem,因为每个子类的字段值不同,但您可以在基类中声明字段,但是在每个子类的构造函数中设置它的值。您的性能比我好几秒钟;-)。
public class U1 extends Rocket {
public U1() {
maxWeight = 18;
}
}
public class U2 extends Rocket {
public U2() {
maxWeight = 23;
}
}
public u1 () {
this.maxWeight = 18;
}