2012-04-05 52 views
17

Tôi đang trong một khóa học java giới thiệu và chúng tôi mới bắt đầu học về kế thừa. Tôi đang làm việc trên một nhiệm vụ yêu cầu chúng ta tạo một siêu lớp "Thú cưng" với tên và tuổi; và ba phân lớp, mỗi phân lớp có đặc điểm riêng của chúng (tôi đã chọn "Chó", "Mèo" và "Chim"). Sau khi chúng ta có tất cả những thứ này, chúng ta sẽ tạo ra một lớp Main để kiểm tra tất cả mọi thứ, và đây là nơi tôi đang gặp vấn đề. Tôi đang cố gắng gọi các phương thức get cho những đặc điểm độc đáo này trong phạm vi Main, nhưng dường như chỉ tìm các phương thức nằm trong siêu lớp.Gọi một phương thức phân lớp từ siêu lớp

Đây là lớp chính:

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

Đây là lớp cha của tôi

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

Và đây là một trong những lớp con (tất cả họ đều giống nhau và đang gặp các lỗi tương tự)

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

Vì vậy, những gì đang xảy ra là tôi không thể tìm ra phương pháp chính để tìm số cat.getColor() meth od, hoặc bất kỳ cái nào khác duy nhất cho các lớp con.

+0

lỗi là gì? Tôi tin rằng bạn phải bỏ nó vì bạn đã làm 'Pet cat = new Cat (...' thay vì 'Cat cat = new Cat (...'. – twain249

+0

Điều này đã xóa nó, cảm ơn bạn! – salxander

Trả lời

24

Khi bạn khai báo biến có kiểu siêu lớp, bạn chỉ có thể truy cập (phương thức) và biến thành viên của siêu lớp thông qua biến đó.

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

Để truy cập vào các phương pháp trong lớp bê tông (Cat trong trường hợp này), bạn cần phải hoặc là khai báo biến như lớp được thừa kế

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 

Hoặc bỏ nó vào một loại mà bạn biết/nghi ngờ là loại bê tông

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 

Bạn thậm chí có thể kết hợp hai phương pháp:

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

Đã bị xóa vì đây là phiên bản hoàn chỉnh và chính xác hơn. – JamesSwift

+0

Điều này đã cứu mạng tôi –

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

Pet không có một phương pháp gọi là getColor()

Bạn cần phải làm:

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

Khi bạn làm điều này:

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

Trình biên dịch thấy con mèo biến như Vật nuôi. Vì vậy, bạn không thể sử dụng phương pháp cụ thể của Cát classe.

Bạn phải khai báo mèo là Loại mèo để giải quyết vấn đề của mình.

Trân trọng.

1

Ở đây bạn đang cố gắng tạo đối tượng kiểu Siêu lớp (cat) bằng cách sử dụng hàm tạo (Cat) là một phương thức lớp con, điều đó là không thể. điều này vi phạm quy tắc Thừa kế.

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

Các vấn đề liên quan