Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пр _ Часть 1.rtf
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.23 Mб
Скачать

Оператор continue

Оператор continue может использоваться только в циклах while, do, for. Если в потоке вычислений встречается оператор continue, то выполнение текущей последовательности операторов (выражений) должно быть прекращено и управление будет передано на начало блока, содержащего этот оператор.

Оператор break

Этот оператор, как и оператор continue, изменяет последовательность выполнения, но не возвращает исполнение к началу цикла, а прерывает его.

Оператор return

Этот оператор предназначен для возврата управления из вызываемого метода в вызывающий. Если в последовательности операторов выполняется return, то управление немедленно (если это не оговорено особо) передается в вызывающий метод. Оператор return может иметь, а может и не иметь аргументов. Если метод не возвращает значений (объявлен как void), то в этом и только этом случае выражение return применяется без аргументов. Если возвращаемое значение есть, то returnобязательно должен применяться с аргументом, чье значение и будет возвращено.

В качестве аргумента return может использоваться выражение.

Использование оператора throw

Помимо того, что предопределенная исключительная ситуация может быть возбуждена исполняющей системой Java, программист сам может явно породить ошибку. Делается это с помощью оператора throw.

Например:

...

public int calculate(int theValue) { 

if (theValue < 0) { 

    throw new Exception("Параметр для вычисления не должен быть

отрицательным");

}

...

Метки (в продолжении темы)

Рассмотрим некоторый пример использование меток:

...

Scaner in = new Scaner(System.in);

int n;

read_data:

while(...) // Этот цикл помечен

{

  ...

  for(...) // Этот цикл не помечен

  {

...

n = in.nextInt();

if(n < 0)

 break read_data; // Случай (1)

if(n == 0)

 break; // Случай (2)

...

  }

  // данный оператор выполняется сразу же после оператора

  // break без метки - случая (2)

  n=10;

  ...

}

// данный оператор выполняется сразу же после оператора

// break с меткой - случая (1)

n=123;

...

Похожий смысл будет иметь код, если заменить

continue read_data; // Случай (1)

и

continue; // Случай (2)

тогда после выполнения (1) управление перейдёт заголовку оператора помеченного цикла

если же выполнится (2), - то заголовку оператора не помеченного цикла

Так же пример помеченного блока:

...

метка:

{

  ...

  if(условие) break метка; //выход из блока

  ...

}

6. Классы: наследование, полиморфизм. Полиморфиз

Полиморфизм означает "любые формы". В объектно-ориентированном программировании это относится к способности объектов по-разному реагировать на один и тот же метод. В языке Java полиморфизм может реализовываться в том, что множество методов имеют одно и то же имя. Java-код использует позднее связывание для поддержания полиморфизма; вызываемый метод, выбирается во время выполнения.

"позднее связывание" - в книге Хорстманна это зовётся "динамическое связывание"

Перегруженные методы - это методы с идентичным именем, но с разными списками аргументов. Замещение, происходит тогда, когда метод подкласса имеет такое же имя, такой же тип возврата и список аргументов, как и метод суперкласса.

Перегрузка 

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

Рассмотрим метод print(), используемый для данных вывода. Данные могут иметь типы int, boolean или char. Для каждого типа данных метод print() должен реализовываться по-разному. Ниже приведён пример использования перегруженных методов:

  void print(int i) {}

  void print(boolean b) {}

  void print(char c) {}

 

Активизированный метод зависит от типа переданных аргументов. Подкласс может перегружать методы, которые он наследует от своего суперкласса. Конструкторы могут перегружаться, что позволяет нам создавать экземпляр класса с разными типами аргументов. В следующем примере конструктор подкласса активизирует перегруженный конструктор суперкласса, который принимает целочисленный аргумент:

class Base { 

Base() {} 

Base(int a) { 

System.out.println(a); 

} //Overloaded constructors 

class Derived { 

Derived(int a, int b) { 

super(a); 

}

Замещение 

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

Замещающий метод должен быть таким же общедоступным, как и переопределённый метод. Замещающий метод не должен генерировать новые или более широкие проверенные исключения, не объявленные исходным методом. В следующем примере активизируется замещённая версия метода print(), так как вызывающий объект является экземпляром производного класса:

class Base { 

void print() { 

System.out.println("Base"); 

}

class Derived extends Base { 

void print() { 

System.out.println("Derived"); 

}

public static void main(String args[]) { 

Base obj = new Derived(); 

obj.print(); // "Derived" is printed 

}

Чтобы вызвать суперкласс-версию замещённого метода из подкласса используйте super.methodName(). В вышеприведённом примере подкласс может использовать функционал метода print() из суперкласса, вызвав super.print().

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

Так же стоит упомянуть:

Аннотация @Override информирует компилятор о том, что метод перегружает метод в суперклассе. Для этого используется следующий синтаксис:

@Override

void method(int a){

...

Эта аннотация необязательная. Ее используют, чтобы избежать ошибок. Так, если указана аннотация @Override, но метод не перегружает ни одного метода, используемого в суперклассах, компилятор выдаст ошибку.

Что такое наследование?

Классы в Java-коде существуют в иерархии. Классы, находящиеся выше данного класса в иерархии, являются суперклассами этого класса. Этот конкретный класс является подклассом каждого класса, находящегося выше в иерархии. Подкласс наследует свойства своих суперклассов. На вершине иерархии каждого класса находится объект Object. Другими словами, каждый класс является подклассом (и наследует из него) класса Object.

Например, предположим, что у нас есть класс Adult, который выглядит следующим образом:

public class Adult { 

protected int age = 0

protected String firstname = "firstname"; 

protected String lastname = "lastname"; 

protected String gender = "MALE"; 

protected int progress = 0;

public Adult() { } 

public void move() { 

System.out.println("Moved."); 

public void talk() { 

System.out.println("Spoke."); 

}

Наш класс Adult неявно наследует свойства Object. Это предполагается для любого класса, поэтому вы не должны указывать extends Object в определении класса. Но что означает выражение, что наш класс наследует свойства своих суперклассов? Это просто означает, что Adult имеет доступ к незащищенным переменным и методам своих суперклассов. В данном случае это означает, что Adult может видеть и использовать из любого своего суперкласса (пока у нас имеется только один):

Открытые методы и переменные, указанные со спецификатором доступа public.