我是OOP的新手,所以我有一个愚蠢的问题,关于何时extends另一个班级。

这是我的例子:

public class Test {
    public Monitor getMonitor(){
        return new LCD();
    }

    class LCD extends Monitor {   NO-ERROR
    class LCD {                   ERROR at line `return new LCD`
        //some other method or function not in Monitor Class. Example:
        boolean isSamsung;
        public LCD whatkindLCD(){
        }
    }
}


我对上面的代码有一个问题:因为LCDMonitor的扩展,并且LCD具有Monitor所没有的其他一些属性/方法。因此,LCDMonitor的子元素,对吗?

这意味着您尝试将“大盒子”放入“小盒子”。因此,为什么当我return new LCD时,Eclipse不会像我仅使用class LCD {那样注意到错误。

谢谢 :)

最佳答案

将继承理解为“是”关系。这是我在新手时代用来理解继承的简单示例。

class Employee
{
    String name;
    int salary;

    Employee()
    {
        name = "Employee";
        salary = 5000;
    }
    public String getName()
    {
        return name;
    }
    public int getSalary()
    {
        return salary;
    }
}
class Manager extends Employee
{
    int bonus;
    int salary;

    Manager()
    {
        bonus = 1000;
        salary = 6000;
    }
    public int getBonus()
    {
        return bonus;
    }
    public int getSalary()
    {
        return salary;
    }
}

class Test
{
    public static void main(String[] args)
    {
        Employee e = new Employee();
        System.out.println(e.getName());
        //System.out.println(e.getBonus());
        System.out.println(e.getSalary());

        System.out.println();

        Manager m = new Manager();
        System.out.println(m.getName());
        System.out.println(m.getBonus());
        System.out.println(m.getSalary());

        System.out.println();

        Employee em = new Manager();
        System.out.println(em.getName());
        //System.out.println(em.getBonus());
        System.out.println(((Manager)em).getBonus());
        System.out.println(em.getSalary());
        }
}


编译器在调用引用类型之前先对其进行查找。
em.getBonus()不起作用,因为Employee没有奖金方法。
但是使用演员表我们可以使其工作。
((经理)em。)getBonus()

编译器在对其调用任何操作之前先查找引用类型的原因如下:

经理[]经理=新经理[10];

将此数组转换为Employee []数组是合法的:

员工[]人员=经理; // 好

当然,为什么不这样呢?毕竟,如果manager [i]是经理,那么它也是雇员。但是实际上,发生了令人惊讶的事情。请记住,经理和员工是对同一数组的引用。

现在考虑一下声明

staff [0] = new Employee(“ John Eipe”,...);

编译器会愉快地允许此分配。
但是人员[0]和经理[0]是相同的参考,因此,似乎我们设法将仅一名员工走私到管理层中
队伍。

那将是非常糟糕的-调用管理器[0] .setBonus(1000)将尝试访问
实例字段不存在,并且会破坏相邻的内存。
为确保不会发生此类损坏,所有数组均会记住带有
创建它们,并监视仅将兼容的引用存储到其中
他们。例如,创建为new Manager [10]的数组记住它是一个数组
经理。尝试存储Employee引用会导致ArrayStoreException。

关于java - OOP Java:可以将子类返回父类吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9365310/

10-11 18:28