АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Вопрос 3.4

Читайте также:
  1. E. Некорректный вопрос
  2. I. Перечень вопросов и тем для подготовки к экзамену
  3. II. Вопросительное предложение
  4. VII. Вопросник для анализа учителем особенностей индивидуального стиля своей педагогической деятельности (А.К. Маркова)
  5. X. примерный перечень вопросов к итоговой аттестации
  6. Аграрный вопрос
  7. Анализ влияния рекламы на продвижение противопростудных средств
  8. Балканский вопрос в начале XXв. Русско-германские отношения
  9. Бланк вопросов
  10. БЛОК № 1 (1 – 10 вопрос)
  11. БЛОК № 2 (11 – 20 вопрос)
  12. Блок № 4 (31 – 40 вопрос)

Дан код:

public class Quest5 {

{System.out.print("1");}

static {System.out.print("2");}

Quest5(){System.out.print("3");}

public static void main(String[] args) {

System.out.print("4");

} }

В результате при компиляции и запуске будет выведено:

1) 1234;

2) 4;

3) 34;

4) 24;

5) 14.

 

 
Глава 4

НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ

Наследование

Отношение между классами, при котором характеристики одного класса (суперкласса) передаются другому классу (подклассу) без их повторного описания, называется наследованием.

Подкласс наследует переменные и методы суперкласса, используя ключевое слово extends. Класс может также реализовывать любое число интерфейсов, используя ключевое слово – implements. Подкласс имеет прямой доступ ко всем открытым переменным и методам родительского класса, как будто они находятся в подклассе. Исключение составляют члены класса, помеченные
private (во всех случаях) и «по умолчанию» для подкласса в другом пакете.
В любом случае (даже если ключевое слово extends отсутствует) класс автоматически наследует свойства суперкласса всех классов – класса Object.

Множественное наследование классов запрещено, хотя его аналог предоставляет реализация интерфейсов, которые не являются классами и содержат описание набора методов, позволяющих задать поведение объекта класса, реализующего эти интерфейсы. Наличие общих методов, которые должны быть реализованы
в разных классах, обеспечивают им сходную функциональность.

Подкласс дополняет члены базового класса своими переменными и методами, имена которых могут частично совпадать с именами членов суперкласса. Если имена методов совпадают, а параметры различаются, то такое явление называется перегрузкой методов.

В подклассе можно объявить (переопределить) метод с тем же именем, списком параметров и возвращаемым значением, что и у метода суперкласса.

Способность ссылки динамически определять версию переопределенного метода в зависимости от переданного ссылке в сообщении типа объекта называется полиморфизмом.

Полиморфизм является основой для реализации механизма динамического или «позднего связывания».

В следующем примере переопределяемый метод typeEmployee() находится в двух классах Employee и Manager. В соответствии с принципом полиморфизма вызывается метод, наиболее близкий к текущему объекту.

/* пример # 1: наследование класса и переопределение метода:

Employee.java: Manager.java: Runner.java */

package chapt04;

 

public class Employee { // рядовой сотрудник

private int id;

public Employee(int idc) {

super (); /* по умолчанию, необязательный явный вызов

конструктора суперкласса */

id = idc;

}

public int getId() {

return id;

}

public void typeEmployee() {

//...

System. out. println("Работник");

}

}

 

package chapt04;

// сотрудник с проектом, за который он отвечает

 

public class Manager extends Employee {

private int idProject;

 

public Manager(int idc, int idp) {

super (idc); /* вызов конструктора суперкласса

с параметром */

idProject = idp;

}

public int getIdProject() {

return idProject;

}

public void typeEmployee() {

//...

System. out. println("Менеджер");

}

}

package chapt04;

 

public class Runner {

public static void main(String[] args) {

Employee b1 = new Employee(7110);

Employee b2 = new Manager(9251, 31);

b1.typeEmployee(); // вызов версии из класса Employee

b2.typeEmployee(); // вызов версии из класса Manager

// b2.getIdProject();// ошибка компиляции!!!

((Manager) b2).getIdProject();

Manager b3 = new Manager(9711, 35);

System. out. println(b3.getIdProject()); // 35

System. out. println(b3.getId()); // 9711

}

}

Объект b1 создается при помощи вызова конструктора класса Employee, и, соответственно, при вызове метода typeEmployee() вызывается версия метода из класса Employee. При создании объекта b2 ссылка типа Employee инициализируется объектом типа Manager. При таком способе инициализации ссылка на суперкласс получает доступ к методам, переопределенным в подклассе.

При объявлении совпадающих по сигнатуре (имя, тип, область видимости) полей в суперклассе и подклассах их значения не переопределяются и никак не пересекаются, то есть существуют в одном объекте независимо друг от друга.
В этом случае задача извлечения требуемого значения определенного поля, принадлежащего классу в цепочке наследования, ложится на программиста. Для
доступа к полям текущего объекта можно использовать указатель this, для
доступа к полям суперкласса – указатель super. Другие возможности рассмотрены в следующем примере:

/* пример # 2: создание объекта подкласса и доступ к полям с одинаковыми именами: Course.java: BaseCourse.java: Logic.java */

package chapt04;

 

public class Course {

public int id = 71;

 

public Course() {

System. out. println("конструктор класса Course");

id = getId(); //!!!

System. out. println(" id=" + id);

}

public int getId() {

System. out. println("getId() класса Course");

return id;

}

}

package chapt04;

 

public class BaseCourse extends Course {

public int id = 90; // так делать не следует!

 

public BaseCourse() {

System. out. println("конструктор класса BaseCourse");

System. out. println(" id=" + getId());

}

public int getId() {

System. out. println("getId() класса BaseCourse");

return id;

}

}

package chapt04;

 

public class Logic {

public static void main(String[] args) {

Course objA = new BaseCourse();

BaseCourse objB = new BaseCourse();

System. out. println("objA: id=" + objA.id);

System. out. println("objB: id=" + objB.id);

Course objC = new Course();

}

}

В результате выполнения данного кода последовательно будет выведено:


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.008 сек.)