2015-09-17 3 views
2

Мой друг задал мне этот вопрос. Почему следующий код не дает ошибки при вызове aa.x()?
Я понимаю, что aa является ссылкой на объект класса B, но вызывает частный метод класса A внутри метода класса A, где он виден и, следовательно, доступен.

Правильно ли я понимаю? Или есть другая причина?Понимание объема частного метода

public class A { 
    public void xyz() { 
     System.out.println("A"); 
    } 
    private void x() { 
     System.out.println("A:x"); 
    } 
    public static void main(String[] args) { 
     B b = new B(); 
     A aa = b; 
     aa.x(); 
     aa.xyz(); 
     B bb = (B) aa; 
     bb.xyz(); 
     bb.xyz12(); 
    } 
} 
class B extends A { 
    public void xyz() { 
     System.out.println("B"); 
    } 
    public void xyz12() { 
     System.out.println("B-12"); 
    } 
} 
+4

Так много дубликатов, поэтому мало времени ... * Редактировать: * Er, ну, может быть, не с подклассом морщин. –

+0

Если вы хотите, чтобы это понять, прочитайте здесь о модификаторах доступа https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html. частный модификатор доступа для класса и основного в этом классе, поэтому нет проблемы с вызовом этого метода. – Gaskoin

+0

Здесь также можно написать 'A aa = new A()' вместо 'A aa = b'. Поскольку 'A aa = b' является законным, а' aa.x() 'является законным внутри' A # main() ', все в порядке. –

ответ

0

Это видно только потому, что основной способ, в котором он вызывается содержится в классе А. Переместить его в класс B, и он не будет работать

3

Я не могу сразу найти дубликат с помощью подкласса , но в основном это тот же ответ, что и ответ this question.

Есть две вещи, которые регулируют доступ к x:

  1. где код, что делает доступ. Поскольку x является закрытым для A, доступ к нему должен быть частью метода в A. Он не может быть в подклассе (B) или не связанном классе.

  2. Какую ссылку вы используете. Если у вас есть ссылка A, вы можете получить доступ к ней x. Если у вас есть ссылка B, вы не можете, , хотя ваш код является частью метода A. Вы можете отправить его на A, а затем получить доступ к x, но вы не можете сделать это напрямую с ссылкой типа B.

+0

Downvoter: Что я здесь не так понял? –

+3

Это меньше о том, где находится код, и больше о типе времени компиляции 'aa'. Вы не сможете выполнить 'b.x()' внутри 'A'. Типы времени выполнения не имеют значения. Сфера охвата и доступность - это время компиляции. –

+0

@SotiriosDelimanolis: Это верно * слишком *, но если у вас есть ссылка 'A'' a', вы не можете делать 'ax()' в коде, отличном от 'A', либо –

0

Поскольку частные методы не наследуются, ссылка на суперкласс ссылается на собственный частный метод.

Ваш метод main - это метод A, поэтому он может позвонить по телефону x() частный метод.

частный модификатор - поле доступно только в пределах его собственного класса.

Смежные вопросы