将继承理解为“是”的关系。这里有一个简单的例子,我用它来理解我在新手年代的继承。
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 []数组:
雇员[]人员=管理人员; //好的
当然,为什么不呢,你可能会想。毕竟,如果经理[我]是经理,那么他也是一名员工。但事实上,令人惊讶的事情正在发生。请记住,经理和员工都是对同一阵列的引用。
现在考虑的声明
人员[0] =新雇员( “约翰Eipe”,...);
编译器会高兴地允许这个任务。 但员工[0]和经理[0]是相同的参考,所以看起来我们设法将仅仅一名员工偷运到管理层 的行列中。
这将是非常糟糕的 - 调用管理器[0] .setBonus(1000)将尝试访问不存在的实例字段并会破坏邻近的内存。 为了确保不会发生此类损坏,所有阵列都记住它们创建时的元素类型 ,并且它们监视只有兼容的引用存储在它们中的 。例如,作为新Manager [10]创建的阵列会记住它是一个由 管理器组成的数组。尝试存储Employee参考会导致ArrayStoreException。
什么是错误信息? – 2012-02-20 17:12:42
不,尝试投掷,当你拿回显示器。 – 2012-02-20 17:13:27
@TedHopp在Eclipse中,它会注意到:'不能从LCD转换为显示器类' – hqt 2012-02-20 17:14:48