2012-04-05 29 views
17

Estoy en un curso introductorio de Java y recién comenzamos a aprender sobre la herencia. Estoy trabajando en una tarea que pide que creamos una superclase "Pet" con nombre y edad; y tres subclases, cada una con su propio rasgo único (he elegido "Perro", "Gato" y "Ave"). Después de tener todos estos creados, debemos crear una clase principal para probar todo, y aquí es donde me encuentro con problemas. Estoy intentando llamar a los métodos get para estos rasgos únicos dentro de Main, pero parece que solo se encuentran los métodos que están en la superclase.Llamar a un método de subclase de la superclase

Aquí es la clase principal:

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());  
    } 
} 

Aquí es mi superclase

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

Y aquí es una de las subclases (todos ellos tienen el mismo aspecto y están teniendo el mismo error)

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

Entonces, ¿qué está pasando? No puedo encontrar el método principal para encontrar la metanfetamina cat.getColor() od, o cualquiera de los otros únicos de las subclases.

+0

¿cuál es el error? Creo que tienes que lanzarlo desde que lo hiciste 'Pet cat = new Cat (...' en lugar de 'Cat cat = new Cat (...'. – twain249

+0

Esto lo aclaró, ¡gracias! – salxander

Respuesta

24

Cuando declara que una variable tiene el tipo de superclase, solo puede acceder a los métodos (públicos) y las variables de miembro de la superclase a través de esa variable.

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

Para acceder a los métodos de la clase concreta (Cat en este caso), es necesario o bien declarar la variable como la clase derivada

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 

O echarlo a un tipo que sabe/sospechosa es el tipo concreto

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 

Usted puede incluso combinar los dos métodos:

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

Mina eliminada porque esta es la versión más completa y completamente correcta. – JamesSwift

+0

Esto me salvó la vida –

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

Pet no tiene un método llamado getColor()

Que tiene que hacer:

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

Al hacer esto:

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

El compilador ver el gato variable como Mascota. Entonces no puedes usar el método específico de Cat classe.

Debe declarar cat como Type Cat para resolver su problema.

Atentamente.

1

Aquí está intentando crear el objeto tipo Superclass (cat) usando el constructor (Cat) que es un método de subclase, eso no es posible. esto está violando la regla de Herencia.

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

Cuestiones relacionadas