我是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(){
}
}
}
我对上面的代码有一个问题:因为
LCD
是Monitor
的扩展,并且LCD
具有Monitor所没有的其他一些属性/方法。因此,LCD
是Monitor
的子元素,对吗?这意味着您尝试将“大盒子”放入“小盒子”。因此,为什么当我
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/