Связь классов и интерфейсов. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Связь классов и интерфейсов.



Механизм интерфейсов помагает обходить ограничение Java, запрещающее множественное наследование в классах. Интерфейсы – это альтернатива, лишенная недостатков множественного наследования. Т.о связь интерфейсов с классами осуществляется через ключевое слово implements – класс реализует тот или иной интерфейс. Нет ограничений на количество интерфейсов, которые может реализовывать класс(они все указываются через запятую). Что значит, что класс реализует интерфейс? Это значит, что в классе должны быть реализованы все методы данного интерфейса. Обратимся к нашей модели – у нас есть класс Студент, который является наследником класса Человек и реализует интерфейс Учебный. Код интерфейса –

Листинг 7.

7.1 public interface Navchalny {

7.2 String var_interf_navchal="Це змінна інтерфейсу Navchalny";

7.3 public boolean navchatys(String oblast_dialnosty,int time);

7.4 public float get_riven_maysternosty(String oblast_dialnosty);

7.5 }

 

В этом интерфейсе присутствуют 2 метода – метод =учиться= (строка 7.2) и метод =показать уровень мастерства по учебной дисциплине=(строка 7.4). Любой класс, который реализует данный интерфейс обязательно должен содержать все методы данного интерфейса. Пример на классе Студент:

Листинг 8.

 

1. package javaapplication38;

 

2. import java.util.Date;

 

3. /**

4. *

4.1. @author Nezdoliy

5. */

6. public class Student extends Human implements Navchalny {

7. Date date_vstup;

8. String specializacia;

9. String universit;

10. String gruppa;

11. int sred_ball;

 

12. public Student(String fio, Date date_vstup, String specializacia, String universit,

13. String gruppa, int sred_ball) {

14. super(fio);

15. this.date_vstup = date_vstup;

16. this.specializacia = specializacia;

17. this.universit = universit;

18. this.gruppa = gruppa;

19. this.sred_ball = sred_ball;

20. System.out.println("Це працює конструктор 1 класу Student ");

21. }

 

22. public void zdaty_sesiu(){

23. System.out.println("Це працює метод zdaty_sesiu у класі Student ");

24. }

25. public void otrymat_stipend(){

26. System.out.println(this.toString());

27. this.zdaty_sesiu();

28. System.out.println("Це працює метод otrymat_stipend у класі Student ");

29. }

30. public static void main(String[] args) {

31. Student std1=new Student("Petrov ", new Date(),"Компьютерна інженерія","ЧДУ","121",85);

32. std1.otrymat_stipend();

33. }

 

34. public boolean navchatys(String oblast_dialnosty, int time) {

35. System.out.println("Це працює метод navchatys у класі Student ");

36. return false;

37. }

 

38. public float get_riven_maysternosty(String oblast_dialnosty) {

39. System.out.println("Це працює метод get_riven_maysternosty у класі Student ");

40. return 0;

41. }

 

42. }

 

Строка 34 и строка 38 Листинга 8 – это реализация в этом классе методов интерфейса Navchalny, который он реализует(строка 6). В случае, когда интерфейсы связаны наследованием и класс реализует младший интерфейс, то в классе должны быть реализованы все методы старших интерфейсов + все методы младшего интерфейса. Пример- интерфейсы Спортивный и Плавательный связаны наследованием. В Спортивном присутствуют методы = бегать на зарядку= и =учавствовать в соревнованиях=, в Плавательном присутствует метод =плавать=. Класс Студент-спортсмен наследуется от класса Студент и реализует интерфейс Плавательный. Это означает, что этот класс имеет все открытые свойства и поведение классов предков(Человек и Студент) и кроме того в поведение класса добавились все методы вышеуказанных интерфейсов. Это контролирует среда разработки и в случае необходимости подскажет нам, какие методы мы забыли реализовать в классе. Пример кода:

 

Листинг 9.

 

  1. package javaapplication38;

 

  1. import java.text.ParseException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.logging.Level;
  5. import java.util.logging.Logger;
  6. /**
  7. *
    • @author Nezdoliy
  8. */
  9. public class Student_sportsmen extends Student implements Plavalnyi{
  10. String fio_trener;

 

  1. public Student_sportsmen(String fio, Date date_vstup, String specializacia, String universit, String gruppa,
  2. int sred_ball, String fio_trener) {
  3. super(fio, date_vstup, specializacia, universit, gruppa, sred_ball);
  4. this.fio_trener = fio_trener;
  5. System.out.println("Це працює конструктор 1 класу Student_sportsmen ");
  6. }

 

  1. public static void main(String[] args) {
  2. try {
  3. SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
  4. Date dat1 = dateFormat.parse("23.01.1991");
  5. Student_sportsmen std1 = new Student_sportsmen("Sidorov S.V.", dat1, "ekolog", "ЧДУ", "356", 76, "Зубрицький О.П.");
  6. std1.pryimaty_ychast_sorevnov("Kiev", new Date(),"Triatlon");
  7. } catch (ParseException ex) {
  8. System.out.println("Це обробка помилок ");
  9. }
  10. }

 

  1. public boolean navchatys(String oblast_dialnosty, int time) {

 

  1. System.out.println("Це працює метод navchatys у класі Student_sportsmen ");
  2. return false;
  3. }

 

  1. public float get_riven_maysternosty(String oblast_dialnosty) {
  2. System.out.println("Це працює метод get_riven_maysternosty у класі Student_sportsmen ");
  3. return 0.0f;
  4. }

 

  1. public void bigaty_na_zarydky() {
  2. System.out.println("Це працює метод bigaty_na_zarydky у класі Student_sportsmen ");
  3. }

 

  1. public boolean pryimaty_ychast_sorevnov(String misce, Date start, String vid_sporty) {
  2. this.plavaty(400);
  3. System.out.println("Студент "+this.fio +", якого тренує "+this.fio_trener+

" приймає участь у змаганнях з "+vid_sporty);

  1. return false;
  2. }

 

public void plavaty(int distancia) {

System.out.println("Це заплив студента "+this.fio+" на "+ distancia+" метрів ");

}

 

}

 

Обработка иключений.

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

 

Листинг 10.

1. package javaapplication38;

 

2. /**

3. *

· @author Nezdoliy

4. */

5. public class Example_exception {

 

6. public static void main(String[] args) {

7. Example_exception.metod1(0);

8. }

9. public static void metod1(int par1){

10. int b=5/par1;

11. }

12. }

При запуске данного кода мы увидим следующее сообщение в консоли.

 

 

Exception in thread "main" java.lang.ArithmeticException: / by zero

at javaapplication38.Example_exception.metod1(Example_exception.java:10)

at javaapplication38.Example_exception.main(Example_exception.java:7)

 

Обработчик по умолчанию показал, что в программе произошла попытка деления на ноль, был создан объект типа java.lang.ArithmeticException (при этом была показана вся последовательность вызовов до строки в методе, которая непосредственно вызвала исключение). Так отрабатывает обработчик по умолчанию.

Если мы хотим по своему обработать данную ошибку, то это может делаться следующим образом. Пример обработки:

 

Листинг 11.

1. package javaapplication38;

 

2. /**

3. *

· @author Nezdoliy

4. */

5. public class Example_exception {

 

 

6. public static void main(String[] args) {

7. Example_exception.metod1(0);

8. }

9. public static void metod1(int par1){

10. try{

11. int b=500/par1;

12. System.out.println("Переменная b = "+b);

13. } catch (ArithmeticException e) {

14. System.out.println("В связи с некорректным входным параметром произведена " +

· "его замена на параметр по умолчанию");

15. metod1(5);

16. }

17. }

18. }

 

Сообщение, которое мы получим на консоли, при запуске данной программы, следующее:

 

В связи с некорректным входным параметром произведена его замена на параметр по умолчанию

Переменная b = 100

 

Таким образом если предполагается возникновение исключения на каком-то участке кода,это код располагается в блоке try-catch (смотри строку 10-13 Листинга 11) При возникновении исключения, создается объект типа Throwable и управление передается блоку catch или finally(в данном случае catch, по finally пример будет ниже). В блоке catch в качестве параметра указывается любой тип, суперклассом которого является класс Exception(строка 13,для этого класса суперклассом является класс Throwable) и далее код, который должен выполняться при возниконвении исключения. Если тип возникшего исключения может быть приведен к тому типу, который указан в параметре блока catch, или точно ему соответствует, то код блока catch выполняется. Если нет, то выполняется блок finally и управление передается обработчику исключений верхнего уровня. Если соответствующий обработчик не будет найден, тогда эту ситуацию перехватит обработчик по умолчанию.

Существует еще две конструкции, которые используются при обработке исключительных ситуаций. Это конструкция throw и throws. Первая конструкция используется в тех случаях, когда разработчик считает необходимым принудительно вызвать исключительную ситуацию(например, когда какие-либо переменные принимают значения допустимые для данного типа данных, но ошибочных с точки зрения логики программы. Переменная, в которой хранится температура пациента (тип float), принимает значение >41,9) Вторая конструкция применяется в тех случаях, когда разработчик по каким-то причинам не считает возможным произвести перехват и обработку исключительной ситуации, и предлагает это сделать своим коллегам.

 

Многопоточность.

Создать новый поток управления в Java возможно 2 способами. Либо сделав класс наследником от класса

Thread, который реализует интерфейс Runnable, либо реализовать в классе сразу этот интерфейс. Второй способ предпочтительней в том случае, когда тот класс, который мы хотим запустить в другом потоке, уже имеет класс-предок(помимо класса Object). В обоих случаях тот код, который будет многопоточным должен быть расположен в методе run, который вляется точкой входа для каждого нового потока, создаваемого на базе этого класса. Пример с расширением классом класса Thread.

Листинг 13

 

 



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 114; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.143.31 (0.028 с.)