Основы Java-переменных - PullRequest
3 голосов
/ 01 июля 2010

Хорошо, я собираюсь смущать себя здесь, но я работаю над проектом, который мне понадобится, чтобы получить некоторую помощь, поэтому мне нужно выработать некоторые соглашения, чтобы я не выглядел слишком глупо.Я занимался Java только 2 месяца, и 100% этого было на Android.

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

Вот пример моего списка переменных для класса:

    Button listen,feed;
Context context = this;
int totalSize = 0;
int downloadedSize = 0;
SeekBar seek;
String[] feedContent = new String[1000];
String[] feedItems = new String[1000];
ListView podcast_list = null;
HtmlGrabber html = new HtmlGrabber();
String pkg = "com.TwitForAndroid";
TextView progress = null;
long cp = 0;
long tp = 0;
String source = null;
 String pageContent = null;
 String pageName = "http://www.shanescode.com";
 DataBaseHelper mdbHelper = new DataBaseHelper(this);
int songdur = 0;

Так что все это переменные, которые я хочу использовать во всем классе.Зачем мне делать что-то статичное или финальное.Я понимаю Public, но зачем делать что-то личное?

Спасибо за вашу помощь и, пожалуйста, не будьте слишком резкими.Мне просто нужно немного разъяснений.

Ответы [ 6 ]

9 голосов
/ 01 июля 2010

Все эти слова изменяют способ, которым переменная, к которой они применяются, может использоваться в коде.

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

public class MyClass{
    public static int myNumber;
}

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

final предотвращает изменение значения переменной после ее установки в первый раз. Ему должно быть присвоено начальное значение либо как часть его объявления:

public final int myNumber = 3;

или как часть конструктора класса:

public MyClass(int number){
    this.myNumber = 3;

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

private изменяет видимость переменной. Закрытая переменная может быть доступна экземпляру, который ее содержит, но не вне этого:

public class MyClass{
    private int myNumber;

    public void changeNumber(int number){
        this.myNumber = number;  //this works
    }
}

MyClass myInstance = new MyClass();
myInstance.myNumber = 3;  //This does not work
myInstance.changeNumber(3) //This works

Видимость используется для управления тем, как переменные класса могут использоваться другим кодом. Это очень важно при написании кода, который будет использоваться другими программистами, чтобы контролировать, как они могут получить доступ к внутренней структуре ваших классов. Публичный и закрытый - на самом деле только два из четырех возможных уровней видимости в Java: остальные защищены и «модификатор no (видимость)» (a.k.a не публичный, не приватный или защищенный). Различия между этими четырьмя уровнями подробно описаны здесь .

1 голос
/ 01 июля 2010

Еще одна вещь, которая может сбить вас с толку, это:

Не все должно быть переменной уровня класса; у вас должна быть переменная, определенная для наименьшей области видимости, которую нужно определить.

Итак, в качестве примера, предположим, что у вашего класса есть только один метод, который использует вашу переменную TextView progress. Переместите это объявление в метод, который нуждается в нем. Таким образом, это приводит в порядок вещи и помогает вам создавать более надежный код, выделяя действительно отдельные элементы.

1 голос
/ 01 июля 2010

Личное

Идея использования частного - скрытие информации .Забудьте о программном обеспечении на секунду;представьте аппаратную часть, например X-Box или что-то в этом роде.Где-то на нем есть маленький люк для доступа изнутри, обычно с наклейкой: «откройте это, и гарантия аннулируется».

Использование private означает наклеивание такой наклейки в программном компоненте;некоторые вещи находятся только «внутри», и в то время как кому-нибудь будет легко открыть его и поиграть с внутренностью , вы дадите им понять, что если они это сделают, вы не несете ответственности занепредвиденное поведение, которое в результате.

Static

Ключевое слово static не означает "одинаково для всех экземпляров класса";это упрощение.Скорее, это антоним «динамический».Использование ключевого слова static означает «Нет динамической диспетчеризации для этого участника».Это означает, что компилятор, а не среда выполнения, определяет, какой код выполняется при вызове этого метода.

Поскольку у вас нет экземпляров объектов во время компиляции, это означает, что член static не имеет доступа кЭкземпляр.

Пример:

public class Cat {
    public static void speak() { System.out.println("meow"); }
}

public class Lion extends Cat {
    public static void speak() { System.out.println("ROAR"); }
}

// ...
public static void main(String argv[]) {
    Cat c = new Lion();
    c.speak();
}

Выше напечатано «мяу», а не «рев», потому что speak является static членом, а объявлентип из c равен Cat, поэтому компилятор создается таким образом, что выполняется Cat.speak, а не Lion.speak.Если бы была динамическая диспетчеризация для static членов, то Lion.speak выполнялся бы, поскольку тип времени выполнения из c равен Lion.

1 голос
/ 01 июля 2010

static = одинаково для всех экземпляров класса.

final = без изменений (ссылка) для конкретного экземпляра.

Если вам нужно, чтобы какое-то поле (так называемая переменная класса) было доступно всем экземплярам класса (например, константе), то вы можете сделать его статическим.

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

Поиск по «java final static» дает довольно полезную дополнительную ссылку на использование этих ключевых слов.


Использование ключевого слова private определяет, к чему могут обращаться другие классы. Я бы сказал, что самое важное - это помочь разработчикам «делать правильные вещи» - вместо того, чтобы обращаться к внутренним объектам реализации другого класса, который может вызывать все виды нежелательного поведения, он заставляет использовать методы доступа / мутатора, которые класс Разработчик может использовать для применения соответствующих ограничений.

0 голосов
/ 01 июля 2010

Одним из аспектов объектно-ориентированного подхода, который сделал его настолько популярным, является то, что вы можете скрыть свои переменные внутри класса. Класс становится как контейнер. Теперь вы, как программист, можете решить, как вы хотите, чтобы пользователи вашего класса взаимодействовали с ним. В Java традиция заключается в предоставлении API - открытого интерфейса для вашего класса с использованием методов этого класса.

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

private int someNumber;

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

public int getSomeNumber()
{
     return someNumber;
}

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

public void setSomeNumber( int someNumber )
{
     this.someNumber = someNumber;
}

Почему все это работает только для того, чтобы получить доступ к ученику, которого вы могли бы так же легко объявить общедоступным? Если вы делаете это, используя этот подход, вы можете контролировать доступ других людей к данным в вашем классе. Представьте, что вы хотите убедиться, что для someNumber задано только число <100. Вы можете обеспечить эту проверку в своем методе setSomeNumber. Объявляя переменные частным доступом, вы защищаете свой класс от неправильного использования и упрощаете его для всех, кто должен его использовать, в том числе для себя! </p>

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

static int classVariable = 0;

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

public static final int MY_CONSTANT = 1;

Хотя есть лучшие способы сделать это сейчас, это все еще распространенная модель. Вы используете эту переменную без какого-либо экземпляра класса, как это:

myInstance.setSomeNumber( MyClass.MY_CONSTANT );

java.awt.Color использует статические переменные таким образом. Вы также можете объявить методы как статические (посмотрите на public static void main, отправную точку для ваших программ). Статика полезна, но используйте ее экономно, потому что создание экземпляров классов часто может привести к лучшему дизайну.

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

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

0 голосов
/ 01 июля 2010

Я не знаю, почему вы делаете что-то личное.

Люди присоединятся и скажут, что личное это очень важная вещь .

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

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

В противном случае, если вы не продаете его, не тратьте много времени на private.

Инвестируйте свое время в отделение интерфейса от реализации. Тщательно документируйте части интерфейса, чтобы убедиться, что вы играете по правилам. Четко и аккуратно держите детали реализации отдельно. Попробуйте использовать private, чтобы компилятор «оглянулся через плечо», чтобы убедиться, что вы действительно отделили интерфейс от реализации.

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