2010-01-24 4 views
4

Для моего обучения в университете я вынужден сделать некоторые уродливые основы java, например, работать без инкапсуляции, основной метод в одном классе и т. Д. (Я не хочу открывать дискуссию о java styleguide, я просто хочу уточнить, что я не буду писать что-то вроде этого за пределами университета)Почему доступ к частному полю запрещен?

Я наткнулся поведение, которое я не могу объяснить мой сам:

public class Person { 
    // fields 
    private int age; 

    public static void main(String[] args) { 
    Person foo1 = new Person(); 
    foo1.age = 40; 
    System.out.println(foo1.age); 
    } 
} 

Почему этот кусок кода компиляцией и работать без ошибок? Как возможно, что я могу получить доступ к частному полю? Странное поведение из-за того, что основной метод в том же классе?

ответ

17

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

Что вас беспокоит? Что кто-то напишет класс, а затем сможет получить доступ к этим методам из своего класса?

Если вы собираетесь беспокоиться о чем-либо, будьте обеспокоены тем, что вы можете получить доступ к закрытым полям в любым классом, используя отражение, но даже это необходимо для множества полезных вещей.

+0

Мне просто интересно, потому что я ожидал, что частный модификатор сделает поля доступными только внутри экземпляра, например, я привык к C#. – citronas

+0

@citronas - C# ведет себя точно так же - частный модификатор относится к классу, а не к экземпляру. http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx – Nate

+0

+1 для использования отражения для получения любого значения любого класса. –

15

Да — в Java, частный класс частный не является экземпляром частного.

Многие другие языки используют экземпляр private, например Ruby и Smalltalk.

+0

О, это новое для меня. Как экземпляр частного модификатора? – citronas

+0

В Ruby все переменные экземпляра являются частными для экземпляра (не модификатор, так как у вас нет выбора). То же самое в Smalltalk. – akuhn

+0

... и для Java нет. – akuhn

1

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

2

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

0

Вы можете написать любой другой статический метод в классе Person и получить доступ к приватным переменным этого метода. Главная - это просто имя. Такова жизнь.

0

Потому что ваш метод main(String[] args) определен внутри класса Person. Если метод был определен вне класса Person, вы бы не смогли этого сделать.

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