3. Переменные. Модификаторы доступа. Статические пременные и переменные экземпляра.
Переменные
Переменная представляет числовое или строковое значение или объект класса. Значение, хранящееся в переменной, может измениться, однако имя остается прежним. Переменная представляет собой один тип поля. Следующий код является простым примером объявления целочисленной переменной, присвоения ей значения и последующего присвоения нового значения.
int x = 1; // x равно 1
x = 2; // а теперь 2
Константа является другим типом поля. Она хранит значение, присваиваемое по завершении компиляции программы, и никогда после этого не изменяется. Константы объявляются помощью ключевого слова const; их использование способствует повышению удобочитаемости кода.
const int speedLimit = 55;
const double pi = 3.14159265358979323846264338327950; // нельзя изменить во время иполнения программы
Модификаторы доступа
- public: публичный, общедоступный класс или член класса. Такой член класса доступен из любого места в коде, а также из других программ и сборок.
- private: закрытый класс или член класса. Представляет полную противоположность модификатору public. Такой закрытый класс или член класса доступен только из кода в том же классе или контексте.
- protected: такой член класса доступен из любого места в текущем классе или в производных классах.
- internal: класс и члены класса с подобным модификатором доступны из любого места кода в той же сборке, однако он недоступен для других программ и сборок (как в случае с модификатором public).
- protected internal: совмещает функционал двух модификаторов. Классы и члены класса с таким модификатором доступны из текущей сборки и из производных классов.
Static
Иногда требуется определить такой член класса, который будет использоваться независимо от всех остальных объектов этого класса. Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно создать член класса для самостоятельного применения без ссылки на конкретный экземпляр объекта. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово static.
В методе типа static должна отсутствовать ссылка this, поскольку такой метод не выполняется относительно какого-либо объекта
В методе типа static допускается непосредственный вызов только других методов типа static, но не метода экземпляра из того самого же класса. Дело в том, что методы экземпляра оперируют конкретными объектами, а метод типа static не вызывается для объекта. Следовательно, у такого метода отсутствуют объекты, которыми он мог бы оперировать.
Аналогичные ограничения накладываются на данные типа static. Для метода типа static непосредственно доступными оказываются только другие данные типа static, определенные в его классе. Он, в частности, не может оперировать переменной экземпляра своего класса, поскольку у него отсутствуют объекты, которыми он мог бы оперировать.
Пример. Статичные переменные и переменные экземпляра
В классе Person переменная count
является статичной, а age
- переменной экземпляра. Метод growUp
является методом
экземпляра, а метод countNewPerson
- статическим методом.
class Person
{
public static ing count = 0; // Число существующих людей
public int age; // Возраст конкретного человека
public Person(int age){
this.age = age;
countNewPerson();
}
public void growUp(){
this.age += 1;
}
private static void countNewPerson(){
count += 1;
}
}
Использование Person
Person person = new Person(20);
// count - статическое поле. Обращаемся к нему через класс
Console.WriteLine(Person.count); // Выводит 1
Person another = new Person(25);
Console.WriteLine(Person.count); // Выводит 2
// growUp - метод экземпляра, работает с конкретным объектом
person.growUp();
Console.WriteLine(person.age); // Выводит 21
// Возраст `another` не поменялся
Console.WriteLine(another.age); // Выводит 25