繁体   English   中英

简单对象类和记录

[英]Simple Object class and records

我目前正在学习Java,并且已经完成了一些教程。 但是,每个练习都集中在一个部分上(例如学习IO,学习String,图形等),但是只有少数几个部分之间混有多个章节。 这意味着我很难编写一个更完整但仍然很简单的程序。

请在我的问题下方查看。 我正在创建一个“汽车类”,在其中创建了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] Car Array中,然后将其保存到外部txt文件中。 解决以下两点后,我将添加到文件保存。

现在的问题:

  1. 如何使扫描仪和显示器更美观。 如您在下面的打印屏幕中所见,数据被加倍(打印到屏幕,并且扫描仪两次显示汽车类型)

在此处输入图片说明

  1. 如何将Car变量存储在一个数组中,然后仅打印模型或制造年份,或者对于Car one,则打印该汽车的所有值。 我知道如何制作一个字符串数组,整数或双精度。 我只是不知道如何将上述变量存储在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()); } 

创建汽车数组的方式与创建String数组的方式相同。

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

阅读同样:

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

另外,将Scanner作为参数传递给setter也不是一个好习惯。 设置器应采用与字段相同类型的参数。 根据您的示例,而不是这样做:

car1.setMake(in);

你做这个:

car1.setMake(in.nextLine());

为了获得更好的打印效果,只需要先打印文字,然后等待用户输入,就不要重新打印输入内容。

1.您当然可以先接受输入,然后显示输入的数据。 所以,

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

并更改设置器方法以提示消息输入内容,

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());

另外,对Car类使用toString方法来获取该类所有实例的值。

 @Override
    public String toString() {
        return "Car [make=" + make + ", model=" + model + ", year=" + year + ", plateNumber=" + plateNumber + "]";
    }

您应该使用Car类的构造函数来设置模型,年份等。 从用户那里获取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()使它看起来更好。 要将汽车添加到汽车[],请使用汽车[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;           
        }    
    }
}

如果可能的话,我强烈建议您更改设计。 在短期内,这似乎是不必要的,对于小型项目而言,这可能是非常好的,但是如果您打算在以后使用充满Car对象的cars[]数组,则进行较小的重新设计可能会使您的代码更容易编写读。

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

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;
    }   
}

然后,您的主类将负责从用户那里获取信息,使用该信息来创建新的汽车,并将这些汽车放入array或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;
    }
}

其背后的想法与“单一责任原则”有关。 如果您正在编写汽车代码,是希望汽车代码知道如何要求用户输入,还是希望汽车代码仅知道如何跟踪有关汽车的信息。 关于此原理的优秀视频可以在这里找到。 希望这不会使事情复杂化。 祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM