將繼承理解爲「是」的關係。這裏有一個簡單的例子,我用它來理解我在新手年代的繼承。
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