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

Параметры переменной длины и неопределенность




Параметры переменной длины и неопределенность

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

// Аргументы переменной длины, перегрузка и неопределенность.

//

// Эта программа содержит ошибку, и ее компиляция

// будет невозможна!

class VarArgs4 {

static void vaTest(int... v) {

System. out. print(" vaTest(int... ): " +

" Количество аргументов: " + v. length +

" Содержимое: " );

for(int x: v)

System. out. print(x + " " );

System. out. println();

}

static void vaTest(boolean... v) {

System. out. print(" vaTest(boolean... ) " +

" Количество аргументов: " + v. length +

" Содержимое: " );

for(boolean x: v)

System. out. print(x + " " );

System. out. println();

}

public static void main(String args[])

{

vaTest(1, 2, 3); // OK

vaTest(true, false, false); // OK

vaTest(); // Ошибка: неопределенность!

}

}

В этой программе перегрузка метода vaTest() выполняется вполне корректно.

Однако ее компиляция будет невозможна из-за следующего вызова:

vaTest(); // Ошибка: неопределенность!

Поскольку параметр типа vararg может быть пустым, этот вызов может быть преобразован в обращение к vaTest(int... ) или к vaTest(boolean... ). Оба варианта допустимы. Поэтому вызов принципиально неоднозначен.

Рассмотрим еще один пример неопределенности. Следующие перегруженные версии метода vaTest() изначально неоднозначны, несмотря на то, что одна из них принимает обычный параметр:

static void vaTest(int... v) { //...

static void vaTest(int n, int... v) { //...

Хотя списки параметров метода vaTest() различны, компилятор не имеет возможности разрешения вызова.

Наследование и полиморфизм

Наследование – одно из фундаментальных понятий объектно-ориентированного программирования, поскольку оно позволяет создавать иерархические классификации. Используя наследование, можно создать общий класс, который определяет характеристики, общие для набора связанных элементов. Затем этот класс может наследоваться другими, более специализированными классами, каждый из которых будет добавлять свои уникальные характеристики. В терминологии Java наследуемый класс называют суперклассом. Наследующий класс носит название подкласса. Следовательно, подкласс – это специализированная версия суперкласса. Он наследует все переменные экземпляра и методы, определенные суперклассом, и добавляет собственные, уникальные элементы.

Основы наследования

Чтобы наследовать класс, достаточно просто вставить определение одного класса в другой с использованием ключевого слова extends. В качестве иллюстрации рассмотрим короткий пример. Следующая программа создает суперкласс A и подкласс B. Обратите внимание на использование ключевого слова extends для создания подкласса класса A.

// Простой пример наследования.

// Создание суперкласса.

class A {

int i, j;

void showij() {

System. out. println(" i и j: " + i + " " + j);

}

}

// Создание подкласса путем расширения класса A.

class B extends A {

int k;

void showk() {

System. out. println(" k: " + k);

}

void sum() {

System. out. println(" i+j+k: " + (i+j+k));

}

}

class SimpleInheritance {

public static void main(String args[]) {

A superOb = new A();

B subOb = new B();

// Суперкласс может использоваться самостоятельно.

superOb. i = 10;

superOb. j = 20;

System. out. println(" Содержимое superOb: " );

superOb. showij();

System. out. println();

/* Подкласс имеет доступ ко всем общедоступным членам

своего суперкласса. */

subOb. i = 7;

subOb. j = 8;

subOb. k = 9;

System. out. println(" Содержимое subOb: " );

subOb. showij();

subOb. showk();

System. out. println();

System. out. println(" Сумма i, j и k в subOb: " );

subOb. sum();

}

}

Эта программа создает следующий вывод:

Содержимое superOb:

i и j: 10 20

Содержимое subOb:

i и j: 7 8

k: 9

Сумма i, j и k в subOb:

i+j+k: 24

Как видите, подкласс B включает в себя все члены своего суперкласса A. Именно поэтому subOb имеет доступ к переменным i и j и может вызывать метод showij(). Кроме того, внутри метода sum() возможна непосредственная ссылка на переменные i и j, как если бы они были частью класса B.

Несмотря на то что A – суперкласс класса B, он также является полностью независимым, самостоятельным классом. То, что класс является суперклассом подкласса, не означает невозможность его самостоятельного использования. Более того, подкласс может быть суперклассом другого подкласса.

Общая форма объявления класса, который наследует от суперкласса, следующая:

class имя_подкласса extends имя_суперкласса {

// тело класса

}

Для каждого создаваемого подкласса можно указывать только один суперкласс. Java не поддерживает наследование нескольких суперклассов в одном подклассе. Как было сказано, можно создать иерархию наследования, в которой подкласс становится суперклассом другого подкласса. Однако никакой класс не может быть собственным суперклассом.

Поделиться:





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



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