Почему внутренний класс может переопределять закрытый метод final?

Я подумал, есть ли смысл объявлять закрытый метод как final, и я подумал, что это не имеет смысла. Но я вообразил, что существует исключительная ситуация, и написал код, чтобы выяснить это:

public class Boom {

    private void touchMe() {
        System.out.println("super::I am not overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub::You suck! I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();
        inner.touchMe();
    }
}

Он скомпилирован и сработал. «Я должен сделать touchMe () final», - подумал я и сделал это:

public class Boom {

    private final void touchMe() {
        System.out.println("super::I am not overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub::You suck! I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();
        inner.touchMe();
    }
}

, и он тоже работает и говорит мне

chicout@chicout-linlap:~$ java Boom
super::I am not overridable!
sub::You suck! I overrided you!

почему?

66
задан Vipin 21 November 2013 в 06:18
поделиться