【问题标题】:How to print class variables - java如何打印类变量 - java
【发布时间】:2015-09-14 11:01:32
【问题描述】:

我打算用 2 个派生类(汽车 + 摩托车)创建​​一个基类(车辆),它们都包含有关每辆车的某些信息。

我正在尝试实例化这些类,但不确定这涉及到什么。我假设我打算使用 toString 方法。

之后,我想将每辆车的每个详细信息打印到控制台。

这是我的基类:

package assignment2;

public class Vehicle {

  int seatNumber;
  int numberMade;
  int yearMade;

  public Vehicle() {}

  public Vehicle(int seatNumber, int numberMade, int yearMade) {
    this.seatNumber = seatNumber;
    this.numberMade = numberMade;
    this.yearMade = yearMade;
  }

  public int getSeatNumber() {
    return seatNumber;
  }

  public int getNumberMade() {
    return numberMade;
  }

  public int getYearMade() {
    return yearMade;
  }
}

这是我的派生类之一(汽车):

package assignment2;

public class Car extends Vehicle {
    public int topSpeed;

    public Car (int startSpeed, //top speed
            int startNumber,    //number of seats
            int startMade,      //number made
            int startYearMade) { //year made
        super(startNumber,startMade, startYearMade);
        topSpeed = startSpeed;
    }

  public Car(int seatNumber, int numberMade, int yearMade) {
    this.seatNumber = 4;
    this.numberMade = 1500000;
    this.yearMade= 1990;
    this.topSpeed = 180;
  }
}

这是另一个派生类,motorbike:

package assignment2;

public class Motorbike extends Vehicle{

    public int topSpeed;

    public Motorbike (int startSpeed, //top speed
            int startNumber,    //number of seats
            int startMade,      //number made
            int startYearMade) { //year made

        super(startNumber,startMade, startYearMade);
        topSpeed = startSpeed;
    }

  public Motorbike(int seatNumber, int numberMade, int yearMade) {
    this.seatNumber = 1;
    this.numberMade = 5000;
    this.yearMade= 2015;
    this.topSpeed = 300;
    }
}

这是我的主要课程:

package assignment2;

public class Assignment2 {


  public static void main(String[] args) {

    int Car;
    Car = new Vehicle().seatNumber;
    Car = new Vehicle().numberMade;
    Car = new Vehicle().yearMade;

    System.out.println(Car);
  }
}

对于我的代码的任何帮助将不胜感激。谢谢!

编辑

是否在每个类中使用 ToString 方法进行覆盖?即。

package assignment2;

public class Car extends Vehicle {
    public int topSpeed;
    
    public Car (int startSpeed, //top speed
            int startNumber,    //number of seats
            int startMade,      //number made
            int startYearMade) { //year made
        super(startNumber,startMade, startYearMade);
        topSpeed = startSpeed;
    }
    
  public Car(int seatNumber, int numberMade, int yearMade) {
    this.seatNumber = seatNumber; //takes the value you pass as parameter
    this.numberMade = numberMade; // and stores it into the instance variable
    this.yearMade= yearMade;
    this.topSpeed = 100;
  }
  
  @Override
  public String toString(){
        return Car.class.toString();
      
  }
}

【问题讨论】:

  • 要么逐个访问变量并以这种方式打印,要么覆盖所需类的ToString并返回您要打印的内容
  • 重写 toString 方法。
  • “我正在尝试实例化这些类,但不确定这涉及到什么”——实例化一个类意味着创建它的一个实例。喜欢Car theCar = new Car();

标签: java class instantiation


【解决方案1】:
public Car(int seatNumber, int numberMade, int yearMade) {
    this.seatNumber = 4;
    this.numberMade = 1500000;
    this.yearMade= 1990;
    this.topSpeed = 180;
  }

仅此块表明您不了解构造函数的概念。

这段代码应该是:

public Car(int seatNumber, int numberMade, int yearMade) {
    this.seatNumber = seatNumber; // takes the value you pass as parameter
    this.numberMade = numberMade; // and stores it into the instance variable
    this.yearMade= yearMade;
    this.topSpeed = 180;          // don't do this, unless you assume to live in a world
// in which every single car has 180 as top speed. pass another parameter for this, or provide setter methods
  }

现在,这里变得奇怪了。

int Car;
    Car = new Vehicle().seatNumber;
    Car = new Vehicle().numberMade;
    Car = new Vehicle().yearMade;

    System.out.println(Car);

嗯……你在做什么?你应该实例化一辆汽车,然后打印它。 另一方面,您所做的是实例化一个称为 Car 的 int,并将值设置为 yearMade(之前的值被覆盖)

所以:实例化汽车:

Car myCar = new Car(5, 5000, 2000);

其中 5 是座位数,5000 是制造汽车的数量,2000 是制造年份。

现在,您只需拨打:System.out.println(myCar); 这将调用打印由 toString 方法返回的字符串。

编辑:为了避免编辑声明您必须覆盖 toString 方法:

是和不是。如果你想打印出好看的 “汽车规格:座位数......”等等,您需要重写 toString 方法并构建您想要返回的字符串。

但是,如果您不覆盖 toString,它仍然可以工作。它将使用继承自 Object 类的 toString 的实现,这通常不是您需要或想要的。

【讨论】:

    【解决方案2】:

    CarMotorbike 是 Vehicle 的子类,因此无论您在其中定义什么属性都将在子类中继承。

    重写CarMotorbike 类中的toSting() 方法,因此当您打印此类的对象时,它将显示toString() 方法中存在的内容。

    @Override
    String toString(){
    
    }
    

    你只需要传递 Car 的实例,

    System.out.println(Car);
    

    如果您使用构造函数,为什么要在那里进行硬编码,构造函数用于在创建对象时初始化对象的值。

    所以,删除

    公共摩托车(int seatNumber,int numberMade,int yearMade){ this.seatNumber = 1; this.numberMade = 5000; this.yearMade= 2015; this.topSpeed = 300; }

    并在构造函数中再添加一个参数topSpeed

    public Motorbike(int seatNumber, int numberMade, int yearMade, int topSpeed){
        this.seatNumber = seatNumber;
        this.numberMade = numberMade;
        this.yearMade= yearMade;
        this.topSpeed = topSpeed;
    }
    

    并在创建 Motorbike 类的对象时进行初始化

    Motorbike mb = new Motorbike(10,20,2015,80);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2022-01-25
      • 2023-03-26
      • 1970-01-01
      • 2016-01-23
      相关资源
      最近更新 更多