2017-02-17 4 views
2

У меня есть класс с именем Robot.java:Наследование конструкторов из суперкласса?

class Robot { 
String name; 
int numLegs; 
float powerLevel; 

Robot(String productName) { 
    name = productName; 
    numLegs = 2; 
    powerLevel = 2.0f; 
} 

void talk(String phrase) { 
    if (powerLevel >= 1.0f) { 
     System.out.println(name + " says " + phrase); 
     powerLevel -= 1.0f; 
    } 
    else { 
     System.out.println(name + " is too weak to talk."); 
    } 
} 

void charge(float amount) { 
    System.out.println(name + " charges."); 
    powerLevel += amount; 
} 
} 

и подкласс под названием TranslationRobot.java:

public class TranslationRobot extends Robot { 
    // class has everything that Robot has implicitly 
    String substitute; // and more features 

    TranslationRobot(String substitute) { 
     this.substitute = substitute; 
    } 

    void translate(String phrase) { 
     this.talk(phrase.replaceAll("a", substitute)); 
    } 

    @Override 
    void charge(float amount) { //overriding 
     System.out.println(name + " charges double."); 
     powerLevel = powerLevel + 2 * amount; 
    } 
} 

Когда я компилирую TranslationRobot.java, я получаю следующее сообщение об ошибке:

TranslationRobot.java:5: error: constructor Robot in class Robot cannot be applied to given types; 
TranslationRobot(String substitute) { 
            ^
required: String 
found: no arguments 
reason: actual and formal argument lists differ in length 

Я понимаю, что это имеет в виду что-то о наследовании от суперкласса, но я действительно не понимаю, в чем проблема.

+1

Конструкторы не наследуются. – Kayaman

ответ

4

Это потому, что подкласс всегда должен вызывать конструктор его родительского класса при его создании. Если родительский класс имеет конструктор без аргументов, это происходит автоматически. Но ваш класс Robot имеет только конструктор, который принимает String, поэтому вам нужно явно вызвать его. Это можно сделать с помощью ключевого слова super.

TranslationRobot(String substitute) { 
    super("YourProductName"); 
    this.substitute = substitute; 
} 

Или, если вы хотите, чтобы дать каждому TranslationRobot уникальное имя продукта, вы можете взять дополнительный аргумент в конструкторе и использовать это:

TranslationRobot(String substitute, String productName) { 
    super(productName); 
    this.substitute = substitute; 
} 
+0

Удивительная благодарность, не имеет значения, что я помещаю внутри супер-метода, пока это строка? я могу написать Robot.name? – user6731064

+0

@ user6731064 Вы можете поместить все, что захотите (до тех пор, пока это String), но 'this.name' - что я думаю, это то, что вы имеете в виду, - не будет делать то, что вы хотите. Помните, что 'name' еще не имеет значения. Для этого нужен этот конструктор. Я предполагаю, что вы хотите, чтобы 'TranslationRobot' взял два' String 'в своем contructor и использовал один из них в качестве аргумента для' super'. – resueman

Смежные вопросы