【问题标题】:java - Subclasses (childs) fields, Static and Non-Staticjava - 子类(子)字段,静态和非静态
【发布时间】:2018-02-04 12:00:58
【问题描述】:

我有以下类,Rocket,我想为它创建子类,比如说“U1”和“U2”。

现在 U1 和 U2 都有:

  • 费用
  • 重量(空时)
  • 最大重量(最大货物限制)

但这些规格在 U1 火箭和 U2 火箭中是不同的,尽管它们都是“火箭”。

如何在父类 Rocket 中声明规范并在子类 U1 和 U2 中赋予它们值?

或者我应该在子类中用它们的值重新声明它们,而在父类中完全跳过声明它们?

【问题讨论】:

  • 我投票结束这个问题,因为这个问题属于 Stack Exchange 网络中的另一个站点softwareengineering.stackexchange.com
  • 欢迎来到 Stack Overflow!请拿起tour,环顾四周,并通读help center,尤其是How do I ask a good question?What topics can I ask about here?。从第二个链接:“请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的摘要,以及您在解决问题时遇到的困难的描述。”
  • 如果这些字段的值是你的火箭 U1 和 U2 之间的唯一区别(如果它们没有不同方法形式的不同独特行为),那么你应该将它们建模为 instances 你的Rocket类:Rocket u1 = new Rocket(cost1, weight1), u2 = new Rocket(cost2, weight2); 子类只有在不同的方法或不同的方法实现的形式存在不同的行为时才需要。
  • 从编码开始,展示你到目前为止所做的事情。

标签: java class inheritance static


【解决方案1】:

类似这样:Rocket 类具有 protected cost, weight, maxWeight 属性。 U1U2 扩展它并使用他们自己的 public 设置器,以他们想要的任何方式设置他们的超级(火箭)类属性。

public class Rocket {
    protected int cost;

    public int getCost(){ return cost;}
}

public class U1 extends Rocket {
    public U1(){ //constructor
        cost = 1; //setting cost of U1 Rocket
    }

    //if public setter is needed, to set cost with any other specs ...
    public void setCost(Specification spec){
        cost = spec.doSomething();
    }
}

public class U1 extends Rocket {
    public U1(){ //constructor
        cost = 2; //setting cost of U2 Rocket
    }

    //if public setter is needed, to set cost with any other specs ...
    public void setCost(Specification spec){
        cost = spec.doSomething();
    }
}

Specification 我的意思是任何不同类型的对象,您需要为成本设置适当的值。

那么,如果你使用类似Rocket rocket = new U1(); 并调用rocket.getCost(),你就有了一个u1 火箭的成本。

但是如果您想从外部设置成本,您应该首先创建 U1 的新实例并使用 setter 设置成本,然后将其投射到 Rocket 并使用 Rocket。

您也可以为您的超类 Rocket 使用构造函数:

public class Rocket {
    private int cost;
    public Rocket(int cost){
        this.cost = cost; //avoid shadowing
    }

    public void doSomethingWithCost(){ ... }
    public int getCost() {...}
}

public class U1 extends Rocket {
    public U1(){
        super(1); //setting default cost of U1 Rocket
    }
    public U1(int cost){
        super(cost); //if you need to set the cost when making new instance of U1
    }

}

这样您可以在父类中使用值,并在子类中设置值。

虽然你的问题不是很清楚,所以我不希望这是你需要的答案。请确保您按照问题下方的链接和 cmets 了解有关社区的更多信息。

另外,如果您认为我的答案是正确的,请投票给我。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多