简单对象 class 和记录

Simple Object class and records

我目前正在学习 Java,我已经完成了几个教程。然而,每个练习都集中在一个部分(例如学习 IO、学习字符串、图形等),但只有少数练习有多个章节混合在一起。这意味着我很难制作一个更完整但仍然简单的程序。

请查看我的问题下方。我正在创建一个 "Car class",其中我创建了 4 个变量。我让用户可以选择插入汽车类型、年份和其他两个选项。 设置所有值后,我们开始显示它们。到目前为止(几乎)很好。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Car {
    String make;
    String model;
    int year;
    String plateNumber; 

    public  Car() {
    }

    // SETS and GETS the type of the Car
    public void setMake (Scanner in) {
        make = in.nextLine();   
    }

    public String getMake () {
        System.out.print("Make: " + make);
        return make;
    }

    // SETS and GETS the model of the Car
    public void setModel (Scanner in) {
        model = in.nextLine();
    }
    public String getModel () {
        System.out.print("Model: " + model);
        return model;
    }

    // SETS and GETS the year of fabrication
    public void setYear(Scanner in) {
        year = in.nextInt();
    }
    public int getYear () {
        System.out.print("Year: " + year);
        return year;
    }

    // SETS and GETS the plateNumber;
    public void setPlate (Scanner in) {
        plateNumber = in.nextLine();
    }
    public String getPlate ()
    {
        System.out.print("License: " + plateNumber);
        return plateNumber;
    }   

    public static void main(String[] args) throws IOException {

        File file = new File("");
        Scanner in = new Scanner(System.in);

        if (!file.exists()) {
            FileWriter writeFile = new FileWriter("cars.txt");
        }

        // CAR 1 ====================
        Car car1 = new Car();
        System.out.println("Car1: ");
        car1.setMake(in);
        car1.getMake();
        car1.setModel(in);
        car1.getModel();        
        car1.setYear(in);
        car1.getYear(); 

        Car [] cars = new Car [5];  // Creates a 5 car array / parking lot

    }

}

在此之后,它应该将数据存储在 [5] 汽车阵列中,然后将它们保存到外部 txt 文件中。保存到文件我会在解决下面两点后添加。

现在的问题:

  1. 如何使扫描器和显示更优雅。正如您在下面的打印屏幕中看到的那样,数据加倍(打印到屏幕和扫描仪两次显示汽车类型)

  1. 如何将 Car 变量存储在一个数组中,然后仅打印型号或仅打印制造年份,或者对于第一个汽车,打印这辆车的所有值。 我知道如何制作一个字符串数组、int 或 double。我只是不知道如何将上述变量存储在 Car 数组中并一个一个地获取 car1 数组值。这让我很困惑。 提前致谢并致以最诚挚的问候,
  1. 当您将 getter 更改为不打印值并更改 getter 和 setter 执行的顺序时,您可以实现此目的:

    //other code
    public String getModel () {
        System.out.print("Model: ");
        return model;
    }
    //other code
    public static void main(String[] args) {
        //other code
        System.out.println("Car1: ");
        car1.getMake();
        car1.setMake(in);
        car1.getModel();
        car1.setModel(in);
        car1.getYear();
        car1.setYear(in);
        //other code
    }
    
  2. 当涉及到第二个问题时,您可以像创建任何其他数组一样创建 Car 对象数组并轻松访问数组元素字段:

    public static void main(String[] args) {
        //other code
        Car [] cars = new Main [5];  
        cars[0] = car1;
        System.out.println(cars[0].getMake());
        System.out.println(cars[0].getModel());
    }
    

创建汽车数组的方式与创建字符串数组的方式相同。

Car carArray[] = new Car[sizeofarray];
carArray[i] = car1; 

阅读也一样:

for(int i = 0; i < carArray.length; i++){
     carArray[i].getModel(); // do something here
}

此外,将 Scanner 作为参数传递给 setter 并不是一个好习惯。 Setter 应该采用与字段相同类型的参数。按照你的例子,而不是你这样做怎么样:

car1.setMake(in);

你这样做:

car1.setMake(in.nextLine());

为了更好的打印,先打印pretext,然后等待用户输入,不要重新打印输入。

1.You当然可以先取输入,再显示输入的数据。所以,

car1.setMake(in);
car1.setModel(in);
car1.setYear(in);
car1.getMake();
car1.getModel(); 
car1.getYear(); 

并更改 setter 方法以提示消息输入内容,

public void setMake (Scanner in) {
    System.out.println("Enter Model : ");
    make = in.next();   
}

2。 ArrayList 在这里比 array 更好,因为您可能不知道汽车的数量。您可以制作一个汽车列表并单独调用该方法以获得预期结果。

    ArrayList<Car> carList = new ArrayList<Car>();
    carList.add(car1);

    //Call the get(index) method to get the car object and then call the class method you want.
    carList.get(0).getMake();
    carList.get(0).getModel();

    //A class always should have a toString() method that returns the string with all the values of class instance.
    System.out.println(carList.get(0).toString());

此外,使用 class Car 的 toString 方法获取 class.

的所有实例的值
 @Override
    public String toString() {
        return "Car [make=" + make + ", model=" + model + ", year=" + year + ", plateNumber=" + plateNumber + "]";
    }

您应该使用 Car 的构造函数 class 来设置型号、年份等。从用户那里获取 Car 信息,然后将其传递给构造函数。

像这样:

public  Car( String make, String model, int year) {
     this.make = make;
     //set the values here
    }

在你的主要方法中:

    String make = in.nextLine();
   // You can prompt the user for the car info and then assign the value respectively. Then pass it to the constructor 

   Car car1 = new Car(make,model,year);

如果你想制作一个汽车对象数组,制作一个while-loop

      Car cars= new Car[5];
       int i=0;
       While(i<5){
     //ask user for input 
    .
    .
    .
    cars[i] = new Car(make,model,year);
   }

使用System.out.println();对于吸气剂而不是 .print() 使它看起来更好。 要将汽车添加到 cars[],您可以使用 cars[x]=car.x+1;

这是一个有趣的问题。似乎有许多不同的方法来解决这个问题。 @NimitPatel 建议的是个好主意。您也可以尝试这样的方法,保持您当前的设计不变。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Car {
    String make;
    String model;
    int year;
    String plateNumber; 

    public  Car() {
    }

    // SETS and GETS the type of the Car
    public void setMake (Scanner in) {
        make = in.nextLine();   
    }

    public String getMake () {
        System.out.print("Make: " + make);
        return make;
    }

    // SETS and GETS the model of the Car
    public void setModel (Scanner in) {
        model = in.nextLine();
    }
    public String getModel () {
        System.out.print("Model: " + model);
        return model;
    }

    // SETS and GETS the year of fabrication
    public void setYear(Scanner in) {
        year = in.nextInt();
    }
    public int getYear () {
        System.out.print("Year: " + year);
        return year;
    }

    // SETS and GETS the plateNumber;
    public void setPlate (Scanner in) {
        plateNumber = in.nextLine();
    }
    public String getPlate ()
    {
        System.out.print("License: " + plateNumber);
        return plateNumber;
    }   

    public static void main(String[] args) throws IOException {

        File file = new File("");
        Scanner in = new Scanner(System.in);

        if (!file.exists()) {
            FileWriter writeFile = new FileWriter("cars.txt");
        }

        Car [] cars = new Car [5];  // Creates a 5 car array / parking lot       

        for(int i = 0; i < 5; i++)
        {
            Car myCar = new Car();
            System.out.println("Enter information for Car" + (i + 1) + ":");
            System.out.println();       
            System.out.print("Car" + (i + 1) + ": ");
            myCar.setMake(in);        
            System.out.print("Model: ");
            myCar.setModel(in);        
            System.out.print("Year: ");
            in.nextLine();           
            System.out.println();
            cars[i] = myCar;           
        }    
    }
}

如果可以的话,我强烈建议您更改设计。简而言之 运行,这似乎是不必要的,对于小型项目来说,这可能是非常必要的,但是如果您打算在以后使用 cars[] 数组填充 Car 个对象, 一个小的重新设计可能会使您的代码更易于阅读。

一个主要建议是创建一个独立的 Car class。这个 class 将只包含有关汽车的逻辑,如何设置有关汽车的信息以及如何从汽车获取信息。也许,像这样:

public class Car 
{
    private String make;
    private String model;
    private String plateNumber; 
    private int year;    

    // Constructor
    public  Car()
    {
    }

    // SETS and GETS the type of the Car
    public void setMake (String make) 
    {
        this.make = make; 
    }

    public String getMake ()
    {        
        return make;
    }

    // SETS and GETS the model of the Car
    public void setModel (String model) 
    {
        this.model = model;
    }

    public String getModel ()
    {        
        return model;
    }

    // SETS and GETS the year of fabrication
    public void setYear(int year) 
    {
        this.year = year;
    }

    public int getYear () 
    {        
        return year;
    }

    // SETS and GETS the plateNumber;
    public void setPlateNumber (String plateNumber)
    {
        this.plateNumber = plateNumber;
    }

    public String getPlateNumber ()
    {       
        return plateNumber;
    }   
}

然后您的主要 class 将负责从用户那里获取信息,使用该信息创建新汽车,并将这些汽车放入数组或 arrayList 中。可能是这样的:

import java.util.Scanner;

public class Main 
{   
    public static void main(String[] args)
    {
        String make, model;
        int year;    
        Car cars[] = new Car[3];

        // Get information about cars from the user
        // Use this information to create a car
        // Store this car in the array
        for(int i = 0; i < cars.length; i++)
        {   
            System.out.println("Enter information for car " + (i + 1));

            make = getMakeFromUser();
            model = getModelFromUser();
            year = getYearFromUser();

            Car myCurrentCar = new Car();
            myCurrentCar.setMake(make);
            myCurrentCar.setModel(model);
            myCurrentCar.setYear(year);

            cars[i] = myCurrentCar;              
            System.out.println();
        }

        // Display information about cars from the array        
        for(int i = 0; i < cars.length; i++)
        {
            System.out.println("Information about car " + (i + 1));
            System.out.println("Make: " + cars[i].getMake());
            System.out.println("Model: " + cars[i].getModel());
            System.out.println("Year: " + cars[i].getYear());
            System.out.println();
        }
    }

    static String getMakeFromUser()
    {
        String make;
        Scanner in = new Scanner(System.in);        
        System.out.print("Make: ");
        make = in.nextLine();
        return make;
    }

    static int getYearFromUser()
    {
        int year;
        Scanner in = new Scanner(System.in);        
        System.out.print("Year: ");
        year = in.nextInt();
        in.nextLine();
        return year;
    }

    static String getModelFromUser()
    {
        String model;
        Scanner in = new Scanner(System.in);        
        System.out.print("Model: ");
        model = in.nextLine();        
        return model;
    }
}

这背后的想法与单一职责原则有关。如果您正在为 Cars 编写代码,您希望您的 Car 代码知道如何要求用户输入,还是希望您的 Car 代码只知道如何跟踪有关 Cars 的信息。可以找到有关此原理的精彩视频 here。希望这不会使事情变得更复杂。祝你好运。