Понимать наследование как отношение "есть". Вот простой пример, который я использовал для понимания наследования в течение моих начинающих лет.
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 нет бонусного метода.
Но используя актерский состав, мы можем заставить его работать.
((Менеджер) эм.) GetBonus ()
Причина, по которой компилятор ищет ссылочный тип перед вызовом любой операции над ним, заключается в следующем:
Менеджер [] Менеджеры = Новый Менеджер [10];
Допустимо преобразовать этот массив в массив Employee []:
сотрудник [] персонал = менеджеры; // ОК
Конечно, почему бы и нет, вы можете подумать. В конце концов, если менеджер [i] является менеджером, он также является сотрудником. Но на самом деле происходит нечто удивительное. Имейте в виду, что менеджеры и персонал являются ссылками на один и тот же массив.
Теперь рассмотрим утверждение
staff [0] = new Employee ("John Eipe", ...);
Компилятор с радостью разрешит это назначение.
Но сотрудники [0] и менеджер [0] - это одна и та же ссылка, поэтому, похоже, нам удалось втянуть в управление простого сотрудника
занимает.
Это было бы очень плохо - вызывающие менеджеры [0] .setBonus (1000) пытались бы получить доступ к
несуществующее поле экземпляра и приведет к повреждению соседней памяти.
Чтобы избежать такого повреждения, все массивы запоминают тип элемента с
которые они были созданы, и они отслеживают, что только совместимые ссылки хранятся в
их. Например, массив, созданный как новый Менеджер [10], помнит, что это массив
менеджеры. Попытка сохранить ссылку Employee вызывает ArrayStoreException.