web-dev-qa-db-ja.com

Javaでオーバーライドされたメソッドのアクセス修飾子を変更しますか?

オーバーライドされたメソッドのアクセス修飾子を変更できる理由はありますか?例えば、

abstract class Foo{
    void start(){...}
}

次に、package-privateアクセス修飾子をpublicに変更します。

final class Bar extends Foo{
    @Override
    public void start(){...}
}

私は好奇心からこの質問をしているだけです。

20
mre

Javaでは、アクセス修飾子より制限的なを作成できません。これは、スーパークラスインスタンスの代わりにサブクラスインスタンスを使用できるようにするという規則に違反するためです。しかし、アクセスを制限することになるとlessええと、おそらくスーパークラスは別の人によって書かれ、彼らはあなたが望む方法を予期していませんでしたそれらのクラスを使用します。

人々が作成するプログラムとプログラミング時に発生する状況は非常に多様であるため、言語設計者は、プログラマーが自分の言語で何をしたいかを「二度と推測」しないほうがよいでしょう。プログラマーがnotサブクラスでアクセス指定子の制限を緩和できるようにする正当な理由がない場合(たとえば)、その決定はに任せたほうがよいでしょう。プログラマー。彼らは個々の状況の詳細を知っていますが、言語デザイナーは知りません。ですから、これはJavaの設計者による良い呼びかけだったと思います。

20
Alex D

クラスを拡張するということは、サブクラスが少なくとも他のクラスに同じ機能を提供する必要があることを意味します。

彼がそれを拡張するならば、それは問題ではありません。

拡張は、新しいメソッドを追加するか、パッケージアクセスメソッドをパブリックにするなど、既存のメソッドをより多くのクラスに提供することによって行うことができます。

6
adranale

1つしかないので、より多くのクラスでオーバーライドを表示したい場合があります。デフォルトの修飾子はないため、publicはそれを拡張します。

6
Oscar Gomez

説明はこれです:-

これはOOPの基本原則です。子クラスは親クラスの本格的なインスタンスであるため、少なくとも親クラスと同じインターフェイスを提示する必要があります。 >保護された/公開されているものを目立たなくすることは、この考えに違反します。子クラスを親クラスのインスタンスとして使用できなくすることができます。

 class Person{
 public void display(){
  //some operation
 }
 }

class Employee extends Person{
private void display(){
   //some operation
 }


 Person p=new Employee();

ここで、pはPerson(super class)タイプのオブジェクト参照です。アクセス修飾子がより制限的であるため、> p.display()を呼び出すと、オブジェクト参照pはEmployeeタイプの子オブジェクトにアクセスできません。

2
nik_7

編集:OK、問題を修正するために回答を変更しました。

それができない場合、アクセス修飾子が異なる同じメソッドを持っているために、クラスがiterfaceを実装してクラスを拡張できない場合があります。

public Interface A {
  public void method();
}

public abstract classs B {
  protected void method();
}

public class AB extends B implements A {
  /*
   * This would't be possible if the access modifier coulnd't be changed
   * to less restrictive
  */
  public void method();
}
1
Pablo