Путаница "переопределить частный метод"
У меня есть два вопроса по этому коду
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()"
Ответы
Ответ 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 ваш экземпляр!