2015-06-18 3 views
-3

я не писал этот Dump вопрос, который должен компилировать и был в недавнем Java 8 экзамен, и это дает мне проблемы:самосвала Java не компилировать

class Vehicle { 
    String type = "4W"; 
    int maxSpeed = 100; 

    Vehicle (String type, int maxSpeed){ 
     this.type = type; 
     this.maxSpeed = maxSpeed; 
     } 
} 

class Car extends Vehicle { 
    String trans; 
    Car(String trans) { 
    this.trans = trans; 
    } 

    Car(String type, int maxSpeed, String trans) { 
    super(type, maxSpeed); 
    this(trans); 
    } 
} 

class Test { 
    public static void main(String[] args) { 

Car c1 = new Car("Auto"); 
Car c2 = new Car("4W", 150, "Manual"); 
System.out.println(c1.type + " " + c1.maxSpeed + " " + c1.trans); 
System.out.println(c2.type + " " + c2.maxSpeed + " " + c2.trans); 

    } 

} 

Ответ по Dump должно быть:

4W 150 Manual 

Вместо этого я получаю:

Unresolved compilation problems: 
    Implicit super constructor Vehicle() is undefined. Must explicitly invoke another constructor 
    Constructor call must be the first statement in a constructor 

Что я делаю неправильно с моей стороны?

+0

Это правильно только для 'c2', для' c1' такого конструктора нет. Удалите строки с 'c1', и все в порядке. – MaxZoom

+0

@MaxZoom Поскольку он говорит, что это вопрос из школы. Я думаю, что он должен писать классы. Вероятно, он, вероятно, ничего не изменит в главном(). – user3437460

+0

В этом случае должна быть напечатана две строки, но есть только одна. – MaxZoom

ответ

1

Я вас неправильное представление здесь ..

Car(String type, int maxSpeed, String trans) { 
    super(type, maxSpeed); //cannot use super() & this() concurrently 
    this(trans);    //cannot use super() & this() concurrently 
} 

Java не позволяют super() и this() называться одновременно в одном конструкторе.

super() означает вызов конструктора из родительского класса. this() означает вызов другого конструктора внутри вашего собственного класса.

Поскольку они фактически вызывают конструктор, они должны быть в первой строке кода.

Итак, вы можете позвонить только по телефону super() или this(). Вы не можете иметь оба в одном конструкторе. Если это разрешено, вы в основном вызываете конструктор дважды, и когда это происходит, возникает двусмысленность.

Какой конструктор должен использовать ваш класс?

3

Этот конструктор является проблемой:

Car(String trans) { 
    this.trans = trans; 
} 

Там только один конструктор в автомобилях, и он принимает два аргумента. У вас нет конструктора по умолчанию. Поэтому, когда вы вызываете конструктор Car только с одним аргументом, компилятор ищет конструктор по умолчанию, который не существует.

Вы можете исправить это, добавив конструктор по умолчанию; что-то вроде этого:

class Vehicle { 

    public static final String DEFAULT_TYPE = "4W"; 
    public static final int DEFAULT_SPEED = 100; 
    protected String type; 
    protected int maxSpeed; 

    Vehicle() { 
     this(DEFAULT_VEHICLE_TYPE, DEFAULT_SPEED); 
    } 

    Vehicle (String type, int maxSpeed){ 
     this.type = type; 
     this.maxSpeed = maxSpeed; 
    } 
} 

Или это:

Car(String trans) { 
    super(trans, Vehicle.DEFAULT_SPEED); 
    this.trans = trans; 
} 
+0

@MaxZoom, я перевернул вашу правую назад. Я написал это так, как я сделал это намеренно. Не меняйте его. – duffymo

1

Я думаю, что это полный код, что ваша школа от вас ожидать.

Вызов конструктора по умолчанию Vehicle() будет автоматически вызывать Vehicle(String, int) из-за this("4W", 100).

class Vehicle { 
    String type; 
    int maxSpeed; 

    Vehicle(){ 
     this("4W", 100); //Set your default values here.. 
    } 
    Vehicle (String type, int maxSpeed){ 
     this.type = type; 
     this.maxSpeed = maxSpeed; 
    } 
} 

Ваш класс автомобиля:

super() могут быть опущены, а потому, что даже если вы не включают в себя, что она неявно вызывается для вас.

class Car extends Vehicle { 
    String trans; 

    Car(String trans) { 
     super(); //Optional 
     this.trans = trans; 
    } 

    Car(String type, int maxSpeed, String trans) { 
     super(type, maxSpeed); 
     this.trans = trans; 
    } 
} 

Выход:

4W 100 Auto 
4W 150 Manual 
Смежные вопросы