Вопрос о перечислениях, определенных внутри класса в Java - PullRequest
6 голосов
/ 04 мая 2009

Этот код взят из практического теста SCJP:

 3. public class Bridge { 
 4.   public enum Suits { 
 5.     CLUBS(20), DIAMONDS(20), HEARTS(30), SPADES(30), 
 6.     NOTRUMP(40) { public int getValue(int bid) { 
                        return ((bid-1)*30)+40; } }; 
 7.     Suits(int points) {  this.points = points;  } 
 8.     private int points; 
 9.     public int getValue(int bid) { return points * bid; } 
10.   } 
11.   public static void main(String[] args) { 
12.     System.out.println(Suits.NOTRUMP.getBidValue(3)); 
13.     System.out.println(Suits.SPADES + " " + Suits.SPADES.points); 
14.     System.out.println(Suits.values()); 
15.   } 
16. } 

В строке 8 points объявлен как приватный, а в строке 13 к нему осуществляется доступ, поэтому, как я вижу, мой ответ будет означать, что компиляция не удалась. Но ответ в книге говорит об обратном. Я что-то здесь упускаю или это опечатка в книге?

Ответы [ 4 ]

11 голосов
/ 04 мая 2009

Весь код внутри одного внешнего класса может получить доступ ко всему в этом внешнем классе, независимо от уровня доступа.

5 голосов
/ 04 мая 2009

Подробно о том, что сказал Степанчег:

Из раздела спецификации языка Java 6.6.1 «Определение доступности» :

если член или конструктор объявлен закрытым, то доступ разрешено, если и только если это происходит в теле класса верхнего уровня который включает в себя декларацию член или конструктор.

По сути, private не означает приватность этого класса, это означает приватность класса верхнего уровня.

3 голосов
/ 04 мая 2009

Первая строка проверки 12

  System.out.println(Suits.NOTRUMP.getBidValue(3)); 

getBidValue не определено

0 голосов
/ 04 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...