【问题标题】:How to access an instance through a method, within an array of objects in Java?如何在 Java 中的对象数组中通过方法访问实例?
【发布时间】:2021-06-05 06:49:06
【问题描述】:

我有一个简单的类,它创建具有三个实例(品牌、油箱容量和油耗-l/100km-)的车辆。这些是公共的,可以使用下面的构造函数创建对象:

public class VehicleClass 
{
    String brand;
    int tank;
    double consumption;

    VehicleClass (String brand, int tank, double consumption)
    {
        this.brand = brand;
        this.tank = tank;
        this.consumption = consumption;
    }
}

我想创建一个包含两辆车的数组,所以在主类中,我创建了这三个对象:

public class VehicleMain 
{
    public static void main (String[] args) 
    {           
        VehicleClass car1 = new VehicleClass ("Ford", 40, 6.5);
        VehicleClass car2 = new VehicleClass ("Volkswagen", 50, 5.0);
        VehicleClass cars[] = new VehicleClass[] {car1, car2}; 
    }
}

我想创建一个方法,使用数组cars,将返回两辆车最大范围的数组。这是我的方法:

public int[] distances (VehicleClass[] car)
{
    int[] range = new int[car.length];
    for (int i = 0; i < car.length; i++)
    {
        range[i] = (int) ((tank * 100) / consumption);
    }
    return range;
}

在主类中使用 import java.util.Arrays 访问此方法:

System.out.println (Arrays.toString (car<number>.distances(cars)));

但是,如果我放 car1,我只会得到 [615, 615],如果我放 car2,我只会得到 [1000, 1000]。我的目标是它会返回[615, 1000]。 放这个,给我一个错误:

System.out.println (Arrays.toString (cars.distances(cars)));

我做错了什么?有没有可能按照我的想法去做?如果有人能澄清我这个问题,我将不胜感激。我是 OOP 的初学者。

【问题讨论】:

  • 也许,在distances 方法中,您的意思是使用car[i].tankcar[i].consumption。目前您只使用接收到distances 方法调用的对象的tankconsumption
  • creates a vehicle with three instances (brand, tank capacity and fuel consumption -l/100km-)。我想你的意思是vehicle with three fields
  • 在 Vehicle 中创建一个新方法,例如Vehicle#distance,返回单辆车的距离。然后,只需为输入数组制作这些距离的数组即可。目前,您正在尝试结合这些概念。
  • 不鼓励使用VehicleClass cars[]语法,推荐的语法是VehicleClass[] cars

标签: java arrays class object instance


【解决方案1】:

我想我会做两件事。在您的 Vehicle 类上创建一个 distance() 函数,该函数返回一辆车的距离,然后使用 Java 地图函数对您的数组进行操作:

public class Vehicle //renamed from VehicleClass
{
    String brand;
    int tank;
    double consumption;

    //etc, constructor stuff...

    public int distance() {
        return (int) ((tank * 100) / consumption);
    }
}

然后在你的主要:

public class VehicleMain 
{
    public static void main (String[] args) 
    {           
        VehicleClass car1 = new VehicleClass ("Ford", 40, 6.5);
        VehicleClass car2 = new VehicleClass ("Volkswagen", 50, 5.0);
        VehicleClass cars[] = new VehicleClass[] {car1, car2}; 
        Integer[] results = Stream.of(cars).map(VehicleClass::distance).toArray(Integer[]::new);
        for (int i : results) {
           System.out.println(i);
        }
    }
}

一般来说,我认为问题在于您将单个 VehicleClass 与 VehicleClass 对象的集合混淆了。在您的距离方法中,您正在遍历传入的汽车,但随后您重复使用来自 this 实例的相同 this.tankthis.consumption 值,而不是例如 car[i].tank

您通常希望将收集逻辑(从数组中的所有内容获取距离)与距离的实际计算分开。距离计算是针对单个车辆的,所以放在 VehicleClass 中,而收集逻辑放在 main 方法中。或者,您也可以将“收集逻辑”放在一个新的 VehicleCollection 类中的 distances 方法中,该方法调用所包含对象的所有 distance 方法。或者,您可以在您的 VehicleClass 上创建一个静态 distances 方法来做同样的事情。

但是,由于您需要的唯一“收集逻辑”是将所有距离映射到一个数组中,因此我认为将其放在 main 方法中是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2014-11-14
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多