Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример 2.1. ЗНАТОКАМ С++ В языке Java все нестатические public методы являются виртуальными функциями, а в С++ виртуальность метода нужно декларировать явно.




Пример 2. 1.

abstract class Pet{ // Создаем абстрактный базовый класс

abstract void voice();

}

/*******************************************/

class Dog extends Pet{

int k = 10;

 

@Override //Эта директива позволяет переопределить функция родительского класса

void voice(){

System. out. println(" Gav-gav! " );

}

}

/*******************************************/

 

class Cat extends Pet{

 

@Override

void voice(){

System. out. println(" Miaou! " );

}

}

/*******************************************/

 

class Cow extends Pet{

 

@Override

void voice(){

System. out. println(" Mu-u-u! " );

}

}

public class Chorus{

public static void main(String[] args){

Pet[] singer = new Pet[3];

singer[0] = new Dog();

singer[1] = new Cat();

singer[2] = new Cow();

for (Pet p: singer)

  p. voice();

}

}

Проверку соответствия сигнатуры переопределяемого метода можно возложить на компилятор, записав перед методом подкласса аннотацию @Override, как это сделано в примере 2. 1. В этом случае компилятор пошлет на консоль сообщение об ошибке, если сигнатура помеченного метода не будет соответствовать сигнатуре ни одного метода суперкласса с тем же именем.

Все дело здесь в определении поля singer[]. Хотя массив ссылок singer[] имеет тип Pet, каждый его элемент ссылается на объект своего типа: Dog, Cat, Cow. При выполнении программы вызывается метод конкретного объекта, а не метод класса, которым определялось имя ссылки. Так в Java реализуется полиморфизм.

 

ЗНАТОКАМ С++ В языке Java все нестатические public методы являются виртуальными функциями, а в С++ виртуальность метода нужно декларировать явно.


Для переопределения метода в языках Java и C++ не требуется использования каких-либо дополнительных ключевых слов: достаточно в классе наследнике реализовать метод с той же самой сигнатурой.

 

Наверняка вы заметили в описании класса Pet слово abstract. Класс Pet и метод voice() являются абстрактными (подобно тому, как в C++ имеются абстрактные классы, не имеющие право на реализацию и не имеющие ключевого слова abstract ).

 

Окончательные члены и классы

Пометив метод модификатором final, можно запретить его переопределение в подклассах. Это удобно в целях безопасности. Вы можете быть уверены, что метод выполняет те действия, которые вы задали. Именно так определены математические функции sin(), cos() и пр. в классе Math. Мы уверены, что метод Math. cos(x) вычисляет именно косинус числа x. Разумеется, такой метод не может быть абстрактным.

Для полной безопасности поля, обрабатываемые окончательными методами, следует сделать закрытыми (private). Если пометить модификатором final параметр метода, то его нельзя будет изменить внутри метода. Если же пометить модификатором final весь класс, то его вообще нельзя будет расширить. Так определен, например, класс Math:

public final class Math{. . . }

 

                                             Метод equals

 

Оператор == определяет, являются ли две ссылки идентичными друг другу (то есть, относятся к одному объекту).


Метод equals определяет, являются ли объекты равными, но не обязательно идентичными.
Реализация метода equals класса Object использует оператор ==.

Классы пользователей могут переопределить метод equals, чтобы реализовать предметно-ориентированный тест на равенство.

 
 Примечание: Вы должны переопределить метод hashCode, если вы переопределяете метод equals.

Прмер 2. 2:

 

public class MyDate {

private int day, month, year;

public MyDate(int d, int m, int y)

{day=d; month=m; year=y;

}

@Override

public boolean equals(Object o)

{

   boolean result =false;

   if(o! =null & & o instanceof MyDate)

   { MyDate d=(MyDate)o;

     if ((day==d. day)& & (month==d. month)& & (year==d. year))

         result=true;

   }

   return result;

}

}

 

public class TestEquals {

 

 

public static void main(String[] args) {

   MyDate date1=new MyDate(7, 11, 2014);

   MyDate date2=new MyDate(7, 11, 2014);

   if (date1==date2)

       System. out. println(" date1 is identical date2" );

   else

       System. out. println(" date1 is not identical date2" );

       

   if (date1. equals(date2))

       System. out. println(" date1 is equald date2" );

   else

       System. out. println(" date1 is not equals date2" );

       

    System. out. println(" set date2=date1" );

    date2=date1;

        

    if (date1==date2)

       System. out. println(" date1 is identical date2" );

   else

       System. out. println(" date1 is not identical date2" );

        

}

}

Результат:

date1 is not identical date2

date1 is equald date2

set date2=date1

date1 is identical date2

2. 5. Задания к лабораторной работе №2

а) Проверьте пример 2. 2. без переопределенного метода equals(), сделайте выводы.

б) Разработать заданную иерархию классов, при разработке конструкторов использовать обращение к суперклассу super. В программе продемонстрировать создание массива разнотипных объектов (подобно примеру 2. 1. ), установку и вывод характеристик каждого объекта.! В массив вносить только уникальные объекты ( equals() ).

 

Вариант1: Разработайте иерархию классов:

 

 

Вариант 2: Разработайте UML – диаграмму и программу:

Написать иерархию классов, описывающих имущество налогоплательщиков. Она должна состоять из абстракт­ного базового класса Property и производных от него классов Appartment, Car и Country House. Базовый класс должен иметь поле worth (стоимость), конструктор с одним параметром, заполняющий это поле, и чисто виртуальный метод рассчета налога, переопределенный в каждом из производных классов. Налог на квартиру вычисляется как 1/1000 ее стоимости, на машину — 1/200, на дачу — 1/500. Также, каждый производный класс должен иметь конструктор с одним параметром, передающий свой параметр конструктору базового класса. В классы Appartment, Car и Country House добавьте поля Address, Volume (объем двигателя) и Square (площадь) соответственно. В методе main создать массив из 10 указателей на Property и заполнить его объектами производных классов (Appartment, Саг и Country House). Вывести на экран величину налога для всех объектов. В массив вносить только уникальные объекты.

Guest
              -login: String -password: String -read: bool; -write: bool; -edit: bool; -delete: bool;
+getLogin(): String +getPassw(): String +getRight(): bool[] +setLogin(n: String) +setPassw( s: String) -setRights( ) +toString (): String +equals(): bool

 Вариант 3: Есть базовый класс Guest (пользователь с ограниченными правами (права доступа можно представить в виде массива bool [] rights ). От него унаследовать классы: Admin (имеет добавочный пароль и максимум прав) и User (должен указать фамилию и должность, не может выполнять удаление). Переопределить toString()

и equals(). В методе main создать массив из 3 указателей на Guest и заполнить его объектами производных классов. При записи в массив проверять на совпадение логинов (метод equals) - В массив вносить только уникальные объекты.

Вариант 4: Разработайте UML – диаграмму и программу:

Написать иерархию классов " научный сотрудник", описывающих ставку и принцип вычисления надбавок. Она должна состоять из абстракт­ного базового класса Scientist и производных от него классов " Старший научный сотрудник", " Младший научный сотрудник" и " ИТР". Базовый класс должен иметь поле salary (ставка) и seniority (стаж), конструктор с двумя параметрами, заполняющий эти поля, и чисто виртуальный метод рассчета надбавок, переопределенный в каждом из производных классов. Надбавки вычисляются так: salary*(1+seniority*x), где x=0, 03, 0, 02 и 0, 01 для СтаршегоНС, МладшегоНС и ИТР соответственно.

Также, каждый производный класс должен иметь конструктор с двумя параметрами, передающий свои параметры конструктору базового класса. В методе main создать массив из 9 указателей на Scientist и заполнить его объектами производных классов. Вывести на экран величину надбавок для всех объектов. В массив вносить только уникальные объекты.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...