Java 我可以从未被子类重写的方法内部访问子对象的字段吗?

Java 我可以从未被子类重写的方法内部访问子对象的字段吗?,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)){

我正试图用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)){
            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;
}