简单对象 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 文件中。保存到文件我会在解决下面两点后添加。
现在的问题:
- 如何使扫描器和显示更优雅。正如您在下面的打印屏幕中看到的那样,数据加倍(打印到屏幕和扫描仪两次显示汽车类型)
- 如何将 Car 变量存储在一个数组中,然后仅打印型号或仅打印制造年份,或者对于第一个汽车,打印这辆车的所有值。
我知道如何制作一个字符串数组、int 或 double。我只是不知道如何将上述变量存储在 Car 数组中并一个一个地获取 car1 数组值。这让我很困惑。
提前致谢并致以最诚挚的问候,
当您将 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
}
当涉及到第二个问题时,您可以像创建任何其他数组一样创建 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。希望这不会使事情变得更复杂。祝你好运。
我目前正在学习 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 文件中。保存到文件我会在解决下面两点后添加。
现在的问题:
- 如何使扫描器和显示更优雅。正如您在下面的打印屏幕中看到的那样,数据加倍(打印到屏幕和扫描仪两次显示汽车类型)
- 如何将 Car 变量存储在一个数组中,然后仅打印型号或仅打印制造年份,或者对于第一个汽车,打印这辆车的所有值。 我知道如何制作一个字符串数组、int 或 double。我只是不知道如何将上述变量存储在 Car 数组中并一个一个地获取 car1 数组值。这让我很困惑。 提前致谢并致以最诚挚的问候,
当您将 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 }
当涉及到第二个问题时,您可以像创建任何其他数组一样创建 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。希望这不会使事情变得更复杂。祝你好运。