2016-02-09 4 views
0

Я учусь полиморфизм, и я получаю эту красную линию в моем суперкласса и sublcass он прокомментировал мой код:Confused об ошибке при обучении полиморфизм

public class Animals { 
    private String name; 

    public Animals(String name) { 
     this.name = name; 
     } 

    public void changeName(String name){ 
     this.name= name; 
    } 

    public String getName(){ 
     return this.name; // 
    } 

} 

вот мой подкласс:

public class Dog extends Animals { 
    private String colour; 

    public Dog(String name, String colour){ 
     super(name); 
     this.colour = colour; 
    } 

    public void changeColour(String colour) { 
     this.colour = colour; 
    } 
    public String getColour(){ 
     return this.colour; 
    } 

}  

Вот другой сценарий с основным методом:

Я не знаю, почему я получаю т hese red lines Редактировать: Код работает, но ничего не выходит. Edit2: Исправлены классы.

+1

Метод 'void' не может« вернуть »значение. – Kenney

+0

Ваш метод 'getName()' объявляет 'void' (т. Е.« Тип возврата ») в качестве возвращаемого типа, но вы пытаетесь вернуть' String', содержимое переменной 'name'. Это несовместимо. Вам нужно будет объявить метод, как 'public String getName()'. –

+1

'public void Animals (String name)' является методом. Чтобы превратить его в конструктор, удалите 'void', поэтому ваш базовый класс имеет только конструктор по умолчанию' public Animals() ', поэтому ошибка конструктора – idelvall

ответ

1

Ваш класс животных должен выглядеть следующим образом

public class Animals { 
    private String name; 

    public Animals(String name) { 
     this.name = name; 
    } 

    public void changeName(String name){ 
     this.name= name; 
    } 

    public String getName(){ 
     return this.name; 
    } 

} 

Проблема у вас есть то, что ваш конструктор имел тип void возврата. Конструкторы не должны иметь тип возврата. Во-вторых, ваш метод getName() имел возвращаемый тип void. Чтобы заставить его работать правильно, вам нужно объявить, что он возвращает. Учитывая это, я оставил бы его для реализации остальной части вашего кода.

0

Конструкторы не должны иметь тип возвращаемого значения, как это подразумевается (конструктор для Dog очевидно возвращаетDog):

public Dog(...) 

не

public void Dog(...) 

То же самое относится и к Animals конечно ,

И ваши get методы объявить тип void возвращения, которое противоречит умыслом, так изменится:

public String getName()... 
public String getColour()... 
0

Похоже getName() установлен, чтобы иметь тип возвращаемого void и вы пытаетесь вернуть String. Измените void на String в этом методе, и красная линия должна исчезнуть там. У вас также есть та же проблема в getColour().

В дополнение к этому у вас не может быть типа возвращаемого значения для ваших конструкторов, поэтому вы должны удалить void.

Ваша линия (Dog) puppy.getColour(); пытается бросить String, который возвращается из puppy.getColour() к Dog объекта. Я считаю, что то, что вы пытаетесь сделать, это позвонить getColour() по телефону puppy, но вы заметили, что сначала это должно быть . Попробуйте это вместо: ((Dog)puppy).getColour();, чтобы вы нанесли puppy на Dog, а затем вы можете вызвать метод, который вы хотите.

0

[ОБНОВЛЕНО]

Я аннотированный проблемные строки в коде.

public class Animals { 
    private String name; 

    /* 
    * This is a method, not a constructor, because it has a return type. 
    * Since there is no constructor, Java will automatically generate an implicit 
    * `Animal` constructor for you -- one with no parameters. 
    * 
    * To fix: remove the return type. 
    */ 
    public void Animals(String name) { 
     this.name = name; 
    } 

    public void changeName(String name){ 
     this.name= name; 
    } 

    /* 
    * The return type should be String, not void. 
    */ 
    public void getName(){ 
     return this.name; // RED LINE: Unexpected return value 
    } 
} 

public class Dog extends Animals { 
    private String colour; 

    /* 
    * 1. A "super(...)" call only makes sense from within a constructor, but this is not 
    * a constructor, due to the void return type. 
    * 2. Java will automatically generate an implicit `Dog` constructor for you -- one with no parameters. 
    * 3. Since the only Animals constructor is the implicit constructor, which has no parameters, 
    * the "super(...)" call would fail even if this was a constructor. 
    * 
    * To fix: Fix Animals, and remove the void return type. 
    */ 
    public void Dog(String name, String colour){ 
     super(name); // RED LINE: constructor Animals in Animals class cannot be applied to given types; 
     this.colour = colour; 
    } 

    public void changeColour(String colour) { 
     this.colour = colour; 
    } 

    /* 
    * The return type should be String, not void. 
    * 
    * To fix: change "void" to "String". 
    */ 
    public void getColour(){ 
     return this.colour; //RED LINE: unexpected return value 
    } 
} 

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

     /* 
     * The only Dog constructor is the implicit constructor, which has no parameters. 
     * 
     * This will be fixed once Dog and Animals are fixed. 
     */ 
     Animals puppy = new Dog("homie", "black"); // constructor Dog cannot be applied to given types; 

     puppy.getName(); 

     /* 
     * Dog.getColour() returns nothing (since its return type is void). 
     * It makes no sense to try to coerce nothing to be of type Dog. 
     * 
     * To call getColor(), you need to coerce puppy to be a Dog this way: 
     * ((Dog) puppy).getColour(); 
     */ 
     (Dog) puppy.getColour(); // not a statement 

    } 
} 
+0

Я установил, что мои классы выбрасывают пустоту, где они не должны были быть. Теперь я нахожусь на основном классе методов, но я все еще не получаю ничего из вывода, даже если я пишу System.out.println (puppy.getName()); Я думал, что это, по крайней мере, напечатает имя для щенка. Что касается (dog) puppy.getColour(); я пытаюсь получить вывод, чтобы показать цвет собаки, но этот метод не существует в суперклассе, так как щенок имеет тип животных, поэтому вместо этого я использовал его (Dog), чтобы он теперь мог печатать out the color – Nabz

+0

Я попытался запустить код после исправления всех аннотированных ошибок, а 'System.out.println (puppy.getName())' распечатывает «homie» для меня. Убедитесь, что вы внесли все предложенные изменения. Я добавлю информацию в свой ответ о том, как исправить проблему принуждения, чтобы вы могли называть 'getColour()'. – cybersam

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