「継承は」関係として継承を理解します。ここでは初心者の間に継承を理解するのに使った簡単な例を示します。
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());
}
}
コンパイラは、操作を呼び出す前に参照型を探します。 Employeeにボーナスメソッドがないため、em.getBonus()は機能しません。 しかし、キャストを使って、それを動作させることができます。 ((マネージャー)EM。)getBonus()
理由コンパイラは次のようにそれは上の任意の操作を呼び出す前に、参照型を探し理由:
マネージャー[]マネージャー=新しいマネージャー[10]。
従業員の[]配列にこの配列を変換することが合法である:
社員[]スタッフ=マネージャ。 // OK
確かに、あなたは考えるかもしれません。結局、manager [i]がマネージャであれば、それも従業員です。しかし実際には、驚くべきことが起こっています。マネージャーとスタッフは同じアレイへの参照であることに注意してください。
今[0]新しい従業員( "ジョンEipe"、...)を=ステートメント
スタッフを検討します。
コンパイラはこの割り当てをうまく許可します。 しかし、staff [0]とmanager [0]は同じ参照であるため、単なる従業員を経営陣に密輸しているかのように見えます。 ランク。
これは非常に悪いことです。呼び出し側のマネージャー[0] .setBonus(1000)は 存在しないインスタンスフィールドにアクセスしようとし、隣接するメモリを破壊します。 このような破損が発生しないように、すべての配列は、作成された の要素タイプを覚えており、互換性のある参照のみが に格納されていることを監視します。たとえば、新しいManager [10]として作成された配列は、 マネージャの配列であることを記憶しています。従業員参照を格納しようとすると、ArrayStoreExceptionが発生します。
エラーメッセージは何ですか? –
いいえ、モニターが戻ったらキャストしてください。 –
@TedHopp Eclipseで、「LCDからMonitorクラスに変換できません」 – hqt