Смущает "переопределить приватный метод" - PullRequest
13 голосов
/ 28 августа 2009

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

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 ()"

Ответы [ 3 ]

24 голосов
/ 28 августа 2009
  1. Метод main находится внутри класса Override, поэтому, конечно, он может видеть приватные члены класса Override.

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

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

2 голосов
/ 28 августа 2009
Override po = new Derived();
po.f();

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

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

Это правильный код, который назовет Derived's f

0 голосов
/ 28 августа 2009

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

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
    }
}

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

...