从Java构造函数获取变量

时间:2019-03-15 15:10:02

标签: java constructor

我是Java编程的新手,很抱歉,这是一个愚蠢的问题。

我很难正确地回答这个问题,但是我有一个任务来创建一个飞机类,该类可以使飞机着陆,起飞等。并且需要使用Testclass对其进行测试。输入新对象后,它将自动为构造函数中的飞机分配一个唯一ID。

我可以使用实例方法很好地做到这一点,因为它有一个返回值返回给Testclass。这个问题想让我在构造函数本身中执行此操作,但是,构造函数从不返回任何内容。因此,该变量永远不会发送到Testclass。我显然不正确地理解OOP。即使当我尝试仅使用getter方法来获取在构造函数中创建的ID时,它也会在构造函数进行此操作之前为我提供初始化变量。到目前为止,这是我所拥有的代码,我完全知道这是错误的,但是如果有人可以指出正确的方向或告诉我如何更好地表达这个问题,那将是很大的帮助。

// I need to enter 3 aircraft into the system in the testclass

public class Aircraft {

  private int aircraftID;
  private static int lastID;
  private String airportcode;
  private int ID = 100;

  private int count;



  public Aircraft(int a, int b, int c){
    // Constructor


     // Assign ID
     this.ID = a;
     lastID = ID;
     ID++;

     this.ID =b;
     lastID = ID;
     ID++;
  }
}

2 个答案:

答案 0 :(得分:1)

好的,您想创建一个具有自动分配的唯一标识符并且可以起飞和降落的飞机。这意味着您需要一个用于跟踪标识符的字段,一个用于跟踪其是否在空中(是否在空中)以及用于起飞和着陆操作的方法的字段。您还需要一个静态字段来生成唯一标识符。 (请注意,此实现不是线程安全的。)

private class Aircraft {

    private static int staticId = 0;
    private int uniqueId = 0;
    private boolean onGround = true; // Aircraft start on the ground in this implementation

    public Aircraft(){
        this.uniqueId = staticId; // putting this line first makes uniqueId zero-indexed in effect
        staticId++;
    }

    public void land(){
        onGround = true;
    }

    public void takeoff(){
        onGround = false;
    }

    public boolean isFlying(){
        return !onGround; // If it's not on the ground, it's flying
    }

    public int getUniqueId(){
        return uniqueId;
    }
}

单元测试检查相关类的所有方法和预期功能:

import org.junit.Test;
import static org.junit.Assert.*;
import Aircraft;

class Testclass {

    private final Aircraft aircraft = new Aircraft();

    @Test
    public void hasId(){
        aircraft.getUniqueId() >= 0;
    }

    @Test
    public void canLand(){
        assertTrue(aircraft.land());
    }

    @Test
    public void canTakeOff(){
        assertTrue(aircraft.takeOff());
    }

    @Test
    public void checkFlightOperationsAreTrackedCorrectly(){
        aircraft.land();
        assertFalse(aircraft.isFlying());
        aircraft.takeOff();
        assertTrue(aircraft.isFlying());
    }
}

答案 1 :(得分:0)

如前所述,构造函数不返回任何内容(简化版本是使用new返回一个对象实例)。我有点猜测您要完成什么,但是我还是会去的。在我看来,您试图将3个对象的构造塞入一个构造函数中-这就是为什么您的构造函数具有3个参数的原因。另外,您还破坏了ID。

我删除了我不太了解的所有变量,只保留了ID,它们随每个实例化的Aircraft递增。 @Override主要用于展示。

public class Aircraft {
    private int aircraftID;
    private static int lastID = 0;

    @Override
    public String toString(){
        return "Aircraft_" + this.aircraftID;
    }

    public Aircraft() {
        lastID++;
        this.aircraftID = lastID;
    }
}

我自由了,写了TestClass只是为了看看我们是否有同样的想法。再次展示printAircraft()方法。

public class TestClass {
    private List<Aircraft> aircrafts;
    public TestClass(){
        aircrafts = new ArrayList<>();
    }

    public void addAircraft(Aircraft a){
        aircrafts.add(a);
    }

    public void printAircraft(){
        Iterator<Aircraft> it = aircrafts.iterator();
        while(it.hasNext()){
            System.out.println(it.next().toString());
        }
    }
}

并进行测试,我们创建了TestClass实例并添加了3个Aircraft实例并打印出内容

public static void main(String[] args) {
    TestClass tc = new TestClass();
    tc.addAircraft(new Aircraft());
    tc.addAircraft(new Aircraft());
    tc.addAircraft(new Aircraft());
    tc.printAircraft();
}

如果要编写TestClass,情况就是这样。如果给出了,将有助于了解其外观-也许可以帮助我们更好地理解。