Lỗi kế thừa trong java

class Person
{
    String name;
    String birthday;

    String getName()
    {
        return name;
    }
    void setName(String ten)
    {
        name = ten;
    }
    void setBirthday(String sn)
    {
        birthday = sn;
    }
    public String toString()
    {
        String temp = "name: " + name + " ; " + " ngay sinh: " + birthday;
        return temp;
    }
}

class Employee extends Person
{
    double salary;

    double getSalary()
    {
        return salary;
    }
    void setSalary(double hesoluong)
    {
        salary = hesoluong;
    }
    public String toString()
    {
        String temp = super.toString() + " ; he so luong: " + salary;
        return temp;
    }
}

class Manager extends Employee
{
    Employee assistant;

    void setAssistant(Employee assis)
    {
        assistant = assis;
    }
    public String toString()
    {
        String temp = "asistant: " + super.toString();
        return temp;
    }
}

public class b5_page_150
{
    public static void main(String[] args)
    {
        Person[] ps = new Person[3];
        ps[0] = new Person();
        ps[1] = new Employee();
        ps[2] = new Manager();

        ps[0].setName("ruoi muoi");
        ps[0].setBirthday("26/7/1999");

        System.out.println( ps[0].toString() );

        ps[1].setName("trau bo");
        ps[1].setBirthday("2605/199x");
        ps[1].setSalary(9.9);

        System.out.println( ps[1].toString() );

    }
}

tại sao em gọi hàm setSalary thì nó báo cant not find sysbol nhỉ

lỗi ở dòng nào thế bạn, ban thử comment dòng gọi setSalary xem còn lỗi ko ?
với những thông tin bạn đưa ra mình chỉ có thể cho bạn link này =))

2 Likes

kethua

đây b ơi

Bạn khai báo mảng ở đây là một mảng Person nên hệ thống sẽ mặc định hiểu toàn bộ Object trong mảng là một Person. Mà Person không có void setSalary nên sẽ bị lỗi vậy đó :smile:


Cách giải quyết ở đây chính là sử dụng Upcasting: ((Employee)ps[1]).setSalary(9.9);
Đọc thêm về Upcasting tại đây:

2 Likes

mình tưởng đây là tính đa hình của java mà

Đúng, tính đa hình chính là thứ giúp bạn add Employee hay Manager vào Person[]. Tuy nhiên chính vì bạn get Object từ Person[] nên hệ thống mới hiểu Object được get ra là một Person :smile: Và thế chúng ta mới phải Upcasting

3 Likes

thanks bạn :relaxed::relaxed::relaxed:

1 Like

không có cơ chế nào làm auto hả b, nếu cứ phải ép kiểu như vậy quả là bất tiện

Đúng rồi bạn ạ :frowning: Hoặc là bạn có thể thử cách sau :smile:

Employee emp = (Employee) ps[1];
emp.setSalary(9.9);

Cách đó thì bạn sẽ chỉ phải Upcasting 1 lần thôi, nhưng sẽ tốn thêm bộ nhớ :frowning:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?