2012-04-05 153 views
17

我在介绍性的java课程,我们刚开始学习继承。我正在研究一项任务,要求我们创建一个名称和年龄为“Pet”的超类;和三个亚类,每个亚类都有自己独特的特征(我选择了“狗”,“猫”和“鸟”)。在完成所有这些构建之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在Main内调用get这些独特特征的方法,但它似乎只能找到超类中的方法。从超类调用子类方法

这里是主类:

public class Kennel { 
    public static void main(String[] args) { 
     // Create the pet objects 
     Pet cat = new Cat("Feline", 12, "Orange"); 
     Pet dog = new Dog("Spot", 14, "Dalmation"); 
     Pet bird = new Bird("Feathers", 56, 12); 

     // Print out the status of the animals 
     System.out.println("I have a cat named " + cat.getName() 
       + ". He is " + cat.getAge() + " years old." 
       + " He is " + cat.getColor() 
       + "When he speaks he says " + cat.speak()); 
     System.out.println("I also have a dog named " + dog.getName() 
       + ". He is " + dog.getAge() + " years old." 
       + " He is a " + dog.getBreed() 
       + " When he speaks he says " + dog.speak()); 
     System.out.println("And Finally I have a bird named " 
       + bird.getName() + ". He is " + bird.getAge() + " years old." 
       + " He has a wingspan of " + bird.getWingspan() + " inches." 
       + " When he speaks he says " + bird.speak());  
    } 
} 

这里是我的超

abstract public class Pet { 
    private String name; 
    private int age; 

    // Constructor 
    public Pet(String petName, int petAge) { 
     this.name = petName; 
     this.age = petAge; 
    } 

    // Getters 
    public String getName() { return(this.name); } 
    public int getAge() { return(this.age); } 

    // Setters 
    public void setName(String nameSet) { this.name = nameSet; } 
    public void setAge(int ageSet) { this.age = ageSet; } 

    // Other Methods 
    abstract public String speak(); 

    // toString 
    @Override 
    public String toString() { 
     String answer = "Name: " + this.name + " Age: " + this.age; 
     return answer; 
    } 
} 

这里是子类中(它们看起来都一样,并且具有相同的错误)

public class Cat extends Pet { 
    private String color; 

    // Constructor 
    public Cat(String petName, int petAge, String petColor) { 
     super(petName, petAge); 
     this.color = petColor; 
    } 

    // Getters 
    public String getColor() { return(this.color); } 

    // Setters 
    public void setColor(String colorSet) { this.color = colorSet; } 

    // Other Methods 
    @Override 
    public String speak() { return "Meow!"; } 

    // toString 
    @Override 
    public String toString() { 
     String answer = "Name: " + super.getName() + " Age: "+super.getAge() 
       + " Color: " + this.color; 
     return answer; 
    } 
} 

所以发生了什么是我不能主要的方法找到cat.getColor()方法od或任何其他子类所特有的。

+0

什么是错误?我相信,自从你做了'猫猫=新猫(...'而不是'猫猫=新猫(...'。 – twain249 2012-04-05 01:46:58

+0

这清除了它,谢谢! – salxander 2012-04-05 01:48:22

回答

24

当您将变量声明为具有超类的类型时,您只能通过该变量访问超类​​的(public)方法和成员变量。

Pet cat = new Cat("Feline",12,"Orange"); 
cat.getName(); // this is OK 
cat.getColor(); // this is not OK, getColor() is not in Pet 

访问(在这种情况下Cat)在具体的类中的方法,你需要或者变量声明为派生类

Cat cat = new Cat("Feline",12,"Orange"); 
cat.getName(); // OK, getName() is part of Cat (and the superclass) 
cat.getColor(); // OK, getColor() is part of Cat 

或者将它转换为你知道一个类型/嫌疑人是具体类型

Pet cat = new Cat("Feline",12,"Orange"); 
((Cat)cat).getName(); // OK (same as above) 
((Cat)cat).getColor(); // now we are looking at cat through the glass of Cat 

你甚至可以结合这两种方法:

Pet pet = new Cat("Feline",12,"Orange"); 
Cat cat = (Cat)pet; 
cat.getName(); // OK 
cat.getColor(); // OK 
+3

删除了我的,因为这是更完整和完全正确的版本。 – JamesSwift 2012-04-05 01:56:54

+0

这救了我的命 – 2017-05-24 19:12:11

1
Pet cat = new Cat("Feline",12,"Orange"); 
^^^ 
This is the error. 

Pet没有一个叫getColor()

你需要做的方法:

Cat cat = new Cat(...); 
1

当你这样做:

Pet cat = new Cat("Feline",12,"Orange"); 

编译器看到变量像猫一样宠物。所以你不能使用Cat类的具体方法。

您必须将cat声明为Type Cat来解决您的问题。

问候。

1

这里您试图使用作为子类方法的构造函数(Cat)创建超类型对象(cat),这是不可能的。这违背了继承的规则。

Pet cat = new Cat("Feline", 12, "Orange");