2015-09-11 3 views
0

В соответствии с инструкцией this в документации Java доступ к открытым членам можно получить на уровнях Class, Package, Sublcass и World. Но скажу, что я создаю два класса:Java: модификатор доступа Confusion

public class TesterClass 
{ 
    public int someNumber = 5; 
} 

public class AnotherClass 
{ 
    public static void main(String [] args) 
    { 
     System.out.println(someNumber); 
    } 
} 

и сохраните их в том же месте. Когда AnotherClass скомпилирован, возникает ошибка, указывающая, что переменная someNumber не может быть распознана. Почему же тогда в документах Java указано, что модификаторы общедоступного доступа разрешают доступ во всем мире? Я понимаю, что я делаю что-то не так, но что происходит точно?

+0

Что делать, если у меня есть еще один класс с полем 'someNumber'. К какому 'someNumber' следует' someNumber'? Знаете ли вы, какие поля экземпляров? Знаете ли вы, какие поля классов? Знаете ли вы, какой объем? (Это все ключевые слова для поиска.) –

+0

Да, я знаком с полями (переменными) и областью видимости, я просто не понял, что я делаю неправильно (не создавая экземпляры и не пытаюсь получить доступ к переменным через точечную нотацию) , Я вижу сейчас. Спасибо! Кроме того, спасибо @RamanSB, ваши примеры помогли. – AleksandrH

+0

@AleksandrH, таблица в официальном учебнике не очень педагогическая имо. Посмотрите на [эту таблицу] (http://stackoverflow.com/a/33627846/276052). Несмотря на то, что он не касается вашего точного вопроса, он немного разъясняет области. – aioobe

ответ

3

Эти два класса никоим образом не связаны, форма или форма.

Вам необходимо создать экземпляр TesterClass в AnotherClass, затем получить доступ к переменной через ссылку.

public class AnotherClass 
{ 
    public static void main(String [] args) 
    { 
     TesterClass classRef = new TesterClass(); 
     System.out.println(classRef.someNumber); 
    } 
} 

Это будет работать и производить выход 5.

Однако, если мы изменили модификатор доступа к переменной счетчика от public до private и затем попытался сделать то же самое, это больше не будет Работа. Переменная count будет недоступна для любого другого класса, кроме класса, объявляющего его.


Чтобы расширить на комментарий Sotirios Delimanolis, рассмотрите следующий сценарий:

public class TesterClass 
    { 
     public int someNumber = 5; 
    } 

    public class CounterExampleClass 
    { 
     public int someNumber = 3; 
    } 

    public class AnotherClass 
    { 
     public static void main(String [] args) 
     { 
      System.out.println(someNumber); 
     } 
    } 

Согласно вашей логике, что будет распечатана 3 или 5? Вы не можете сказать. Следовательно, переменные доступны через ссылочную переменную, ссылочный класс указывает, к каким полям можно получить доступ. То есть

TesterClass tRef = new TesterClass(); 
    tRef.someNumber; //5 

    CounterExampleClass cRef = new CounterExampleClass(); 
    cRef.someNumber; //3 
1

Переменная вы ссылаетесь, обязан принести ошибки, поскольку она не recongised в этом классе, создать первый экземпляр TesterClass

TesterClass testObj=new TesterClass(); 
//then call println 
System.out.println(testObj.someNumber); 

Никогда не использовать переменные, объявленные нету !! ... Happy кодирование

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