С классом мы уже столкнулись при написании нашей первой программы на Java в уроке 3. И это не случайно - без классов на Java нельзя обойтись даже в самой простой программе. На этом же занятии и на нескольких следующих мы с вами и будем изучать классы и все, что с ними связано - наследование, конструкторы, виртуальные функции и другие мудреные вещи.
Давайте создадим новую программу. Вот ее текст:
class worker
{
private int Age;
public String Name;
public void setAge(int newAge)
{
if(newAge>=0)
Age=newAge;
else
Age=0;
}
public int getAge()
{
return Age;
}
}
class Test{
public static void main(String [] args){
worker wrk=new worker();
wrk.setAge(23);
wrk.Name="Ivan";
System.out.println(wrk.getAge() + "\n" + wrk.Name);
}
}
Сохраните эту программу в файле Test.java и откомпилируйте. При запуске наша программа должны выдать две строчки: 23 и Ivan.
Что мы в нашей программе делаем? Сначала мы определяем класс worker. Делается это с помощью ключевого слова class:
class worker
{
...
}
В классе мы определяем две переменные - Age для возраста и Name для имени. Кроме типа переменых (int и String) мы используем еще модификаторы доступа - private (означает, что наша переменная не будет видна снаружи класса) и public (с наружи класса доступ есть). Раз переменную Age мы объявили как private, то пишем два метода в нашем классе: setAge для чтения возраста и getAge - для записи. Эти методы мы объявляем с модификатором public, это значит, что мы сможем их вызывать снаружи класса. Метод getAge просто возвращет наш возраст, а метод setAge делает небольшую проверку, и записывает в Age только положительный возраст или нуль в противном случае. Если вы раньше программировали на C++, то обратите внимание, во-первых, что модификаторы доступа ставятся перед каждой переменной и перед каждым методом и во-вторых, что после заакрывающей фигурной скобки класса точку с запятой ставить не надо.
Класс Test служит для испытания класса worker. В нем мы заводим экземпляр нашего класса:
...
worker wrk=new worker();
...
Это мы делаем за два этапа - сначала заводим переменную типа worker (которая является ссылкой на объект), и затем определяем сам объект (с помощью оператора new).
После создания объекта мы можем вызывать его методы, обращаться к открытым переменным и т. п. Это мы и делаем в строчках
Классы можно писать не с нуля, а взяв за основу существующий класс. В этом случае эти классы будут являтся потомком и предком друг для друга. Потомка еще называют подклассом (subclass), а предка - суперклассом (superclass). Еще одна пара названий для таких классов - это класс-потомок и класс-предок.
Если один класс есть потомок другого, то он автоматически умеет делать все то, что умеет делать класс-предок. И нам остаеться только добавить в него то, чего не было в предке или изменить те методы, работа которых в классе-предке нас не удовлетворяет. В этом одна из главных черт Объектно-ориентированного программирования - если у некоторых объектов есть много общего, то можно для них создать класс-предок, в который записать все общие черты. Отличительные же черты будут реализованы в классах-потомках.
Давайте создадим класс boss, который будет потомком для класса worker из прошлого урока. Вот текст, который введите с том же файле Test.java, в котором находится класс worker:
class worker
{
...
}
class boss extends worker
{
public int NumOfWorkers; //Количество подчиненных
}
Ключевое слово extends означает, что наш новый класс boss есть потомок класса worker. Мы добавили в него только переменную NumOfWorkers, в которой будет храниться количество подчиненных. Класс же Test измените следующим образом:
...
public static void main(String [] args){
boss bigBoss=new boss();
bigBoss.setAge(41);
bigBoss.Name="Ivan Ivanov";
bigBoss.NumOfWorkers=100;
System.out.println(bigBoss.NumOfWorkers + "\n" + bigBoss.Name);
...
Как вы видите, кроме количества подчиненных для нашего bigBoss мы можем задавать имя и возраст. Они берутся из родительского класса. Все работает, как и ожидалось.