2014-11-19 2 views
-1

Согласно link, определение говорит, The private modifier specifies that the member can only be accessed in its own class.Это правильное определение «частного» модификатора доступа в java?

Но ниже код может получить доступ к закрытому члену item супер класса в суб классе.

class SuperType { 
    private int item; 
    public void setItem(int item){ 
     this.item = item; 
    } 
    public int getItem(){ 
     return item; 
    } 
} 

public class SubType extends SuperType{ 
    public static void main(String[] args){ 
     SubType s = new SubType(); 
     s.setItem(2); 
     System.out.println(s.getItem()); 

    } 
} 

Следует также понимать, что s.item не работает, потому что item не является членом SubType класса.

Как я могу понять это определение?

+0

так, смысл этого определения: 'Частный модификатор указывает, что элемент может быть доступен только в своем собственном class.' что вы не можете сказать: 's.item'. Это определение использует слово «доступ» в отношении доступа к элементу непосредственно 's.item'. Он не говорит о косвенном доступе, я прав? Думаю, это был мой вопрос. – overexchange

ответ

1

У вас есть правильное определение, и вы получаете доступ к полю private с помощью общего доступа и мутатора. То, что вы не можете сделать это,

s.item = 2; 

, который вы могли бы, если item был public. Кроме того, здесь неактуален тот факт, что SubType является подклассом SuperType. Каждый класс может получить доступ к item своим публичным доступом (и мутатором).

+0

Я не могу сказать, 's.item' в подклассе, потому что' item' не является членом подкласса. – overexchange

+1

@overexchange Вы могли бы, если бы это было 'public' или' protected'. –

4

Модификаторы доступа влияют на direct Доступ к этому члену.

SubType может получить доступ к item косвенно, с помощью метода public газопоглощающего, который существует в SuperType и, таким образом, имеет доступ к переменной-члена в privateitem.

Но SubType не может непосредственно доступа к нему, то это ошибка, если в SubType:

s.item // error; private in SuperType 
+0

ОК. Понял тебя.Другой вопрос: «Когда мы разрабатываем классы, мы назначаем модификатор доступа любому члену (данным/поведению) класса, рассматривая« прямой доступ », но не« косвенный доступ ». я прав? – overexchange

+0

Да, модификатор доступа контролирует прямой доступ. Обратите внимание, что это играет важную роль в инкапсуляции данных, где переменные-члены обычно являются «частными», а методы «public», поэтому методы обеспечивают косвенный и контролируемый доступ к данным. – rgettman

+0

еще не понял смысл «инкапсуляции данных», но мой дальнейший вопрос, я понимаю, ссылочная переменная '' 'типа' class SubType' имеет прямой доступ к члену (поведению) 'setItem()', поэтому мы в состоянии сказать 's.setitem (2);' but 'setItem()' является членом 'class SubType' после наследования, как этот член' setItem() 'получает доступ к' private item' 'класса SuperType'? Я думаю, что член 'setItem()' класса SuperType' должен иметь доступ только к 'private item'. потому что определение говорит: '... в своем собственном классе' &' s.setItem() 'является членом' class SubType', но не 'класса SuperType'. – overexchange

0
  1. Вы можете использовать геттер и сеттер методу Acces/мутировать частные пользователь в классе. Геттеры и сеттеры объявляются «публичными».

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

  3. Решение или обходное решение - использовать спецификатор доступа «Защищенный», который позволяет вам напрямую получать/изменять свойства класса без каких-либо геттеров и сеттеров. Область использования - это только пакет, где будут классы и другие классы. Защищенный не требует наследования класса. Пока классы находятся в одном пакете, они могут обращаться к защищенным членам соседа.

Очень хорошее объяснение было дать в SO в прошлом - In Java, difference between default, public, protected, and private