2014-01-28 57 views
0

我正在做一个继承和多态性的练习,我有3个独立的分类,我的主类,一个超级动物类和一个子猫类。我在Animal和Cat类中都创建了重载的构造函数,getter和setter以及toString()方法。我想我的遗传部分已经下降了。现在我需要制作2个动物对象引用,这两个动物对象都是猫的一个实例,例如:一个类型为名字Tobbie的Siameese。试图找出继承和多态性

任何人都可以给我一个这些对象引用的例子吗?你可以看到我在我的主课上尝试过,但我不确定这是否正确。

以下是我目前使用的三个不同类。

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 
      + '}'; 
} 
} 

这里是我的猫类。

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

我认为你有正确的instantia猫的目标。现在,如果您要在主方法中调用Siamese.toString(),它将调用Cat类的toString方法。 – Susie

+0

只是一个提示,你忘了初始化Cat类的构造函数中的字段名称。您应该使用'super(name);'作为Cat构造函数的第一行来调用超类的构造函数。当然有一个名字。 – rhobincu

+0

此外,类Cat中的overriden方法toString()将仅显示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)构造函数
  • 我想我会让动物abstract及其构造函数protected。我认为让客户直接实例化动物而不指定它们是哪种动物是一种不好的做法。

编辑: 像这样:

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

不过,我不认为这是一个很好的做法,这样做,可能是你想要做什么是更好的其他方式实现。

编辑:

猫的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

查看John Ms的回答。 – AnxGotta