2010-07-06 2 views
0

Как сделать поля доступными по всему пакету? В настоящее время, даже если они объявлены публичными, я не могу получить доступ к полям из другого класса в том же пакете.Доступ к полям по всему пакету

+2

Это не должно быть. Почтовый индекс Pls, который представляет вашу проблему. – RoflcoptrException

+0

У вас должен быть доступ к ним, если они находятся в одном пакете - можете ли вы отправить какой-то код (2 класса, о которых идет речь). – xil3

+2

Возможно, вам нужен импорт на эти классы. – Pentium10

ответ

0

Вот более уместный пример. (Основываясь на примере @ Andreas_D ... как если бы это не было очевидно!)

Обратите внимание, что импорт не необходим для ссылки на класс, объявленный в том же пакете.

package pkg; 

public class One { 
    public int fieldOne; 
} 

package pkg; 

public class Two { 
    private One one; 
    public int getOne() { 
    return one.fieldOne; 
    } 
} 

Сказав это, ссылаясь на общественные атрибуты, объявленные в другом классе, как правило, плохая идея. Лучше объявлять атрибуты как частные и обращаться к ним с помощью методов getter и setter. (Если атрибуты представлены как общественности, и они не являются окончательными, что все может изменить их. Кроме того, нет никакого способа, что подкласс может скрыть атрибуты, или изменить способ, которым они ведут себя.)

EDIT

Для иллюстрации последнего пункта:

public class A { 
    public int counter; 
    private int counter2; 
    public int getCounter2() { return counter2; } 
    public void setCounter2(int c) { counter2 = c; } 
} 

public class B extends A { 
    public void setCounter2(int c) { 
     if (c < 0) throw new IllegalArgumentException("counter2 cannot be negative"); 
     super.setCounter2(c); 
    } 
} 

Сравните путь, что counter и counter2 атрибуты ведут себя. В случае counter любой код в любом классе может читать или обновлять атрибут без ограничений. Это относится как к экземплярам класса A, так и к любым классам, которые расширяют A. Если какой-либо другой класс решает установить counter на плохое значение ... нет ничего, чтобы предотвратить его.

В случае counter2, атрибут экземпляра A может быть считан или обновляться getCounter2 и setCounter2 методов соответственно только. Если я захочу, я могу изменить эти методы в A, чтобы выполнить проверку, выполнить проверки доступа, уведомить слушателя о состоянии изменения и так далее. И поскольку это поведение может возникать только в методах A, я знаю, с чего начать искать в случае чего-то странного.

Если я определяю подкласс A (например B), я могу переопределение один или оба из способов сделать что-то другое. Но учтите, что, поскольку я решил объявить фактический атрибут как private, метод setCounter2 в B все равно должен вызвать метод в своем суперклассе. И это тоже хорошо.

+0

Точка отмечена. Но не могу ли я иметь открытый член класса A, к которому можно напрямую обращаться по классу B (я имею в виду без необходимости в экземпляре класса A). Классы A и B принадлежат к одной и той же упаковке. В соответствии с привилегиями доступа, это должно быть возможно? – Namratha

+0

@Namratha - да, это так. Вы пытались скомпилировать мой пример? –

+0

есть. ваш код составлен отлично. Я просто не понимаю, почему у меня проблема. См. Мой код ниже. вот мой код: class A extends Activity {public boolean flag = false; } класс B расширяет ListActivity {if (flag) // error здесь: флаг не может быть разрешен} A и B принадлежат к одному и тому же пакету, и я также включил строку import org.example.Myapp.A в файле B.java – Namratha

0

Следующий код должен быть скомпилирован. Второй класс имеет доступ к полю в первом классе. Пожалуйста, проверьте свое, если есть разница.

package one; 

public class A { 
    public int fieldA; 
} 

package two; 
import one.A; 

public class B { 
    private A a; 
    public int getA() { 
    return a.fieldA; 
    } 
} 
+0

Это должно быть «import one.One;» И использование одного и того же имени для пакета и атрибута в том же классе излишне запутывает. –

+0

yikes - спасибо, исправлены/улучшены оба. –

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