Шилдт Герберт
Шрифт:
• Аналогичные ограничения накладываются на данные типа static. Для метода типа static непосредственно доступными оказываются только другие данные типа static, определенные в его классе. Он, в частности, не может оперировать переменной экземпляра своего класса, поскольку у него отсутствуют объекты, которыми он мог бы оперировать.
Ниже приведен пример класса, в котором недопустим метод ValDivDenom типа static.
class StaticError {
public int Denom =3; // обычная переменная экземпляра public static int Val = 1024; // статическая переменная
/* Ошибка! Непосредственный доступ к нестатической переменной из статического метода недопустим. */ static int ValDivDenom {
return Val/Denom; // не подлежит компиляции!
}
}
В данном примере кода Denom является обычной переменной, которая недоступна из метода типа static. Но в то же время в этом методе можно воспользоваться переменной Val, поскольку она объявлена как static.
Аналогичная ошибка возникает при попытке вызвать нестатический метод из статического метода того же самого класса, как в приведенном ниже примере.
using System;
class AnotherStaticError {
// Нестатический метод, void NonStaticMeth {
Console.WriteLine("В методе NonStaticMeth.");
}
/* Ошибка! Непосредственный вызов нестатического метода из статического метода недопустим. */ static void staticMeth {
NonStaticMeth; // не подлежит компиляции!
}
}
В данном случае попытка вызвать нестатический метод (т.е. метод экземпляра) из статического метода приводит к ошибке во время компиляции.
Следует особо подчеркнуть, что из метода типа static нельзя вызывать методы экземпляра и получать доступ к переменным экземпляра его класса, как это обычно делается посредством объектов данного класса. И объясняется это тем, что без указания конкретного объекта переменная или метод экземпляра оказываются недоступными. Например, приведенный ниже фрагмент кода считается совершенно верным.
class MyClass -{
// Нестатический метод, void NonStaticMeth {
Console.WriteLine("В методе NonStaticMeth.");
}
/* Нестатический метод может быть вызван из статического метода по ссылке на объект. */ public static void staticMeth(MyClass ob) { ob.NonStaticMeth; // все верно!
}
}
В данном примере метод NonStaticMeth вызывается из метода staticMeth по ссылке на объект ob типа MyClass.
Поля типа static не зависят от конкретного объекта, и поэтому они удобны для хранения информации, применимой ко всему классу. Ниже приведен пример программы, демонстрирующей подобную ситуацию. В этой программе поле типа static служит для хранения количества существующих объектов.
// Использовать поле типа static для подсчета // экземпляров существующих объектов.
using System;
class Countlnst {
static int count = 0;
// Инкрементировать подсчет, когда создается объект.
public Countlnst {
count++;
}
// Декрементировать подсчет, когда уничтожается объект.
~CountInst { count—;
}
public static int GetCountO { return count;
}
}
class CountDemo {
static void Main {
Countlnst ob;
for(int i=0; i < 10; i++) {
ob = new CountlnstO;
Console.WriteLine("Текущий подсчет: " + Countlnst.GetCount);
}
}
}
Выполнение этой программы приводит к следующему результату.
Текущий подсчет: 1 Текущий подсчет: 2 Текущий подсчет: 3 Текущий подсчет: 4 Текущий подсчет: 5 Текущий подсчет: 6 Текущий подсчет: 7 Текущий подсчет: 8 Текущий подсчет: 9 Текущий подсчет: 10