2014-01-28 3 views
0

Я выполняю упражнение по наследованию и полиморфизму, у меня есть 3 отдельных класа, мой основной класс, суперкласс Animal и класс Cat Cat. Я сделал перегруженные конструкторы, геттеры и сеттеры, а также методы toString() в классах Animal и Cat. Я думаю, что у меня есть часть наследства. Теперь мне нужно сделать 2 ссылки на объекты животных, как экземпляр Cat, например: один тип Siameese с именем Tobbie.Попытка выяснить Наследование и полиморфизм

Может ли кто-нибудь дать мне пример одной из этих ссылок на объекты? Вы можете видеть, что я попытался в моем основном классе, но я не уверен, что это правильно.

Вот три разных класса, которые у меня есть в настоящее время.

public class Hw02 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    Animal Siamese = new Cat("Tobbie"); 
} 
} 

Вот мой класс для животных.

public class Animal { 

private String name; 

public Animal() { 
    this("na"); 
} 

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

/** 
* @return the name 
*/ 
public String getName() { 
    return name; 
} 

/** 
* @param name the name to set 
*/ 
public void setName(String name) { 
    this.name = name; 
} 

@Override 
public String toString() { 
    return "Animal{" 
      + "name=" 
      + name 
      + '}'; 
} 
} 

И вот мой класс Cat.

public class Cat extends Animal { 

private String type; 

public Cat() { 
} 

public Cat(String type) { 
    this.type = type; 
} 

public Cat(String type, String name) { 
    this.type = type; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

@Override 
public String toString() { 
    return "Cat{" 
      + "type=" 
      + type 
      + '}'; 
} 
} 
+0

Я думаю, что у вас есть правильный экземпляр ted объект кошки. Теперь, если вы вызовете Siamese.toString() в своем основном методе, он вызовет метод toString класса Cat. – Susie

+0

Просто подсказка, вы забыли инициализировать имя поля в конструкторах класса Cat. Вы должны вызвать конструктор суперкласса, используя 'super (name);' как первую строку в вашем конструкторе Cat. Конечно, это имя. – rhobincu

+0

Кроме того, метод overriden toString() в классе Cat отображает только тип cat, а не его имя. – rhobincu

ответ

1
// in main method 
Animal tobbie = new Cat("siamese", "Tobbie") 
Animal jackie = new Cat("tomcat", "Jackie") 

// in Cat class 
public Cat(String type, String name) { 
     super(name) 
     this.type = type; 
} 

Несколько комментариев:

  • Это не является правильным условность иметь имя Siamese; имена переменных должны быть «camelCase» (начинаются с строчной буквы). Компилятор примет это, как вы написали, но это плохая практика.
  • Ваш конструктор Cat(String type, String name) не вызывал конструктор надлежащего суперкласса, поэтому тип был потерян; то же для конструктора Cat(String type)
  • Я думаю, что сделал бы Animal abstract и его конструкторы protected. Я считаю, что плохая практика позволяет клиентам напрямую создавать экземпляры Животные, не указывая, какие животные они есть.

Edit: Как это:

Animal animal = new Animal("What am I?") 

Однако, я не считаю это хорошая практика, чтобы сделать это, вероятно, что вы хотите сделать лучше достигается иначе.

Edit:

Cat ToString():

public String toString() { 
    return super.toString() + " Cat{type=" + type + "}"; 
} 
+0

Ах, спасибо большое, как я могу сделать ссылку на объект Animal экземпляра животного, с именем «Что я?»? – Tonno22

+0

См. Править выше. –

+0

Большое спасибо, это было очень полезно. – Tonno22

0

С кодом у вас есть выше, это пример:

Animal animal0 = new Cat("Siamese", "Bob"); 
Animal animal1 = new Cat("Tomcat", "Frank"); 
Animal animal2 = new Cat("Tomcat", "George"); 
Animal animal3 = new Animal("Elephant"); 

System.out.print(animal0.toString()); 
System.out.print(animal1.toString()); 
System.out.print(animal2.toString()); 
System.out.print(animal3.toString()); 

производят ли выход:

Cat{type=Siamese} 
Cat{type=Tomcat} 
Cat{type=Tomcat} 
Animal{name=Elephant} 
+0

Я хочу, чтобы он производил что-то вроде этого. – Tonno22

+0

См. Ответ Джона Мэй. – AnxGotta

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