Подтвердить что ты не робот

Путаница "переопределить частный метод"

У меня есть два вопроса по этому коду

public class Override {
    private void f() {
        System.out.println("private f()");
    }
    public static void main(String[] args) {
        Override po = new Derived();
        po.f();
    }
}

class Derived extends Override {
    public void f() {
        System.out.println("public f()");
    }
} 

/*
* Output: private f()
*/// :~

1) Как функция f видна в ссылке Override po;

2) Почему вывод "private f()"

4b9b3361

Ответ 1

  • Метод main находится внутри класса Override, поэтому он может видеть частные члены класса Override.

  • Вы не переопределяете метод f в классе Derived, полиморфизма нет. Тип переменной po равен Override, поэтому он примет метод f из класса Override.

Обратите внимание, что метод f в классе Override вообще не отображается в классе Derived. Метод f в классе Derived - это другой метод, который не имеет никакого отношения к методу f в суперклассе.

Ответ 2

Override po = new Derived();
po.f();

Вы получаете доступ к собственному методу Override, даже если объект получен, потому что в соответствии с правилами области действия частные члены класса считаются первыми, и поскольку он написан в области Override, он ссылается на частный f, а так как его частный не переопределяйтесь в классе Derived вообще, они будут переопределяться, только если подпись метода та же.

Derived po = new Derived();
po.f(); 

Thsi - это правильный код, который вызывает Derived f

Ответ 3

Переопределение метода имеет три условия. Класс класса должен иметь одинаковое имя и параметры, а возвращаемое значение - как его суперкласс. Но если оба параметра и возвращаемое значение различаются, поэтому переопределение не существует! даже если два метода - это другой метод! ok! вот так:

public class Parent {
          public  int addV(int a,int b){
        int s;
        s = a + b;
        return s;
    }
}

class Child extends Parent{
    public  void  addV(){
       //do...something
    }
}

Eclipse не будет говорить об ошибке! потому что метод addV в классе Child отличается от метода addV в классе Parent.As ваш экземпляр!