オーバーライドの修飾子
アクセス修飾子
アクセス修飾子は、アクセス制限を弱める方向でオーバーライドできます。即ち、protected メソッドは public に変更できますが、アクセス修飾子のないメソッドをprivate 宣言することはできません。アクセス修飾子の規則の例外として、private 修飾されたメソッドはオーバーライドできません。private 修飾されたメンバーは、同じパッケージ内のサブクラスからも見えない/継承されないので、オーバーライドではなく、まったく別のメソッドとして実装されることになるからです。フィールドについて言えば、private なフィールドは本質的にfinalです。privatメソッドは、サブクラスにおいて、同じシグネチャで実装しても、別のものと解釈されるの
オーバーライドにまつわる一切の制限を受けません。従って、private メソッドを abstract 修飾することはできません。
コンパイル・エラーとなります。
final
final 修飾子が宣言されたメソッドはオーバーライドできません。
final 修飾子は自身がオーバーライドされないようにするための修飾子です。 従って、abstract, private と final 修飾子は同居できません。同じメソッドに同時に指定するとコンパイル・エラーとなります。尚、先に説明したとおり、abstract と private、abstract と static を同時に指定してもコンパイル・エラーとなります。
static
static 修飾子が宣言されたメソッドは、オーバーライド時にも static 修飾子が必須です。static 修飾されたメソッドをクラス・メソッドと呼びます。staticなメソッドをオーバーライドによって非staticメソッドにすることはできません。その逆に、非 static なメソッドを static なメソッドにオーバーライドすることもできません。static -> 非static は言語仕様で禁止されています。逆の、非static -> static の場合は言語仕様で禁止されているわけではないのですが、スーパークラスへの型適合時に矛盾をき
たすものと思われます。尚、private メソッドと同様に、 static 修飾されたクラスメソッドを abstract 修飾するコンパイル・エラーとなります。スーパークラスとサブクラスでの、非static <-> static 間の再定義や private メンバーの再定義は、言語仕様上許されません。しかしながら、static <-> static や private なメンバーはサブクラスで再定義可能です。これは、オーバーライドとは区別され、隠蔽と呼ばれています。
最終更新:2006年12月06日 21:51