Приветствую Вас ГостьВторник, 14.05.2024, 08:41

Программирование на Java, Android, Delphi


Блог

Главная » 2013 » Январь » 28 » Интерфейсы в Java
11:59
Интерфейсы в Java
Язык Java поддерживает интерфейсы. В интерфейсах можно объявлять методы и переменные. Методы по умолчанию имеют модификатор доступа public. Переменные по умолчанию имеют доступ public и неявно объявлены как статические (static) и финальные (final, по сути это константа). Класс, который реализует интерфейс должен реализовать все методы, объявленные в интерфейсе. Класс может реализовывать несколько интерфейсов.
interface ShowDialog{
//объявление метода в интерфейсе
void ShowDialog();
//объявление переменной в интерфейсе
int itfvariable = 100;
}

//Тот же интерфейс, но с явно заданными модификаторами доступа и указанием статичности переменных интерфейса
//interface ShowDialog{
// public void ShowDialog();
// public final static int variable = 100;
//}


class A implements ShowDialog{

@Override
public void ShowDialog() {
JOptionPane.showMessageDialog(null, "Это реализация интерфейса ShowDialog классом А");
}

}

//этот класс можно наследовать
class B implements ShowDialog{

@Override
public void ShowDialog() {
JOptionPane.showMessageDialog(null, "Это реализация интерфейса ShowDialog классом B");
}

}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

//создаем два класса которые реализуют интерфейс ShowDialog
A a = new A();
B b = new B();

//объявляем переменную интерфейсного типа и вызываем метод из класса A, потом из класса B
ShowDialog sd;
sd = a;
sd.ShowDialog();
sd = b;
sd.ShowDialog();

//интерфейсная переменная с конструктором класса
ShowDialog sdi = new A();
sdi.ShowDialog();

//вот так использовать переменные, объявленные в интерфейсе
//они являются статическими, поэтому доступ к ним осуществляется через имя класса или интерфейса
JOptionPane.showMessageDialog(rootPane, A.itfvariable);
JOptionPane.showMessageDialog(rootPane, B.itfvariable);
JOptionPane.showMessageDialog(rootPane, ShowDialog.itfvariable);

}

Как и класс, интерфейс который не является вложенным может иметь модификатор доступа public или не иметь модификатор доступа (модификатор доступа по умолчанию). Если интерфейс имеет модификатор доступа по умолчанию, то он доступен только внутри пакета, в котором он объявлен. Если интерфейс имеет модификатор доступа public, то он доступен отовсюду. При этом он должен быть единственным публичным интерфейсом в модуле и название модуля должно совпадать с названием интерфейса.

Класс, который реализует интерфейс может либо вообще не реализовывать методы интерфейса, либо реализовать часть методов интерфейса. Тогда такой класс должен быть объявлен абстрактным (abstract). При этом наследники данного класса должны реализовать все методы, которые не были реализованы в суперклассе.

//описываем интерфейс
interface MyInterface{
void FirstProc();
String SecondProc();
}

//класс может не реализовывать все методы интерфейса, тогда он объявляется как абстрактный
abstract class A implements MyInterface{
@Override
public void FirstProc(){
JOptionPane.showMessageDialog(null, "Метод FirstProc реализован в классе А");
}
}

//так как в классе А интерфейс реализован не полностью здесь мы должны реализовать метод SecondProc
class B extends A{

@Override
public String SecondProc() {
return "Метод SecondProc реализован в классе B";
}

}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
MyInterface itf = new B();
itf.FirstProc();
JOptionPane.showMessageDialog(null, itf.SecondProc());

}

Описание интерфейса может быть вложенным – мы можем вкладывать описание интерфейса внутрь описания класса или другого интерфейса. Вложенный интерфейс может иметь модификатор доступа private, protected, public или по умолчанию.

//описание класса
class SomeClass{
void MethodSomeClass(){}

//описание вложенного интерфейса
interface SomeClassItf{
void SomeMethod();
}
}


//описание внешнего интерфейса
interface OuterInterface{
void OuterInterfaceMethod();

//описание вложенного интерфейса
interface InnerInterface{
void InnerInterfaceMethod();
}
}
При этом использование вложенного интерфейса идет через имя внешнего класса или интерфейса:
class A implements OuterInterface.InnerInterface, SomeClass.SomeClassItf{
@Override public void InnerInterfaceMethod(){
JOptionPane.showMessageDialog(null, "InnerInterfaceMethod");
}

@Override public void SomeMethod(){
JOptionPane.showMessageDialog(null, "SomeMethod");
}
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
SomeClass.SomeClassItf si = new A();
si.SomeMethod();

OuterInterface.InnerInterface ii = new A();
ii.InnerInterfaceMethod();
}
Интерфейсы можно использовать для импорта констант в классы. Для этого объявляется интерфейс с переменными. После этого в класс, который реализует интерфейс импортируются эти переменные интерфейса и их можно использовать в данном классе.
//объявляем в интерфейсе только переменные (они статичные и финальные - то есть константы)
interface Constants{
String one = "Один";
String two = "Два";
String three = "Три";
String unknown = "Не знаю";
}

//импортируем константы в класс
class MyChoise implements Constants{
void Dialog(){
String s = JOptionPane.showInputDialog("Введите число");
switch(s)
{
//используем в классе импортированные из интерфейса константы
case "1": JOptionPane.showMessageDialog(null, this.one); break;
case "2": JOptionPane.showMessageDialog(null, this.two); break;
case "3": JOptionPane.showMessageDialog(null, this.three); break;
default: JOptionPane.showMessageDialog(null, this.unknown); break;
}
}


}

//импортируем константы из интерфейса еще в один класс
class NewClass implements Constants{
void ShowAllConstants(){
JOptionPane.showMessageDialog(null, one);
JOptionPane.showMessageDialog(null, two);
JOptionPane.showMessageDialog(null, three);
JOptionPane.showMessageDialog(null, unknown);
}
}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
MyChoise mc = new MyChoise();
mc.Dialog();

NewClass nc = new NewClass();
nc.ShowAllConstants();
}
Интерфейсы поддерживают наследование. Мы можем расширить один интерфейс от другого с использованием ключевого слова extends. При этом класс, который реализует интерфейс обязан реализовать все методы данного интерфейса и все методы всех его супер интерфейсов. Также такой класс импортирует все переменные со всей иерархии интерфейсов. Например:
//супер интерфейс A
interface A{
int a_value = 1;
void A();
}

//интерфейс B расширяет интерфейс А
interface B extends A{
int b_value = 2;
void B();
}

//интерфейс С расширяет интерфейс В
interface C extends B{
int c_value = 3;
void C();
}

//класс, который реализует интерфейс C должен реализовать методы всей цепочки наследования
//интерфейсов, то есть А, В и С
class Test implements C{
@Override
public void A(){JOptionPane.showMessageDialog(null, "Метод A");}
@Override
public void B(){JOptionPane.showMessageDialog(null, "Метод B");}
@Override
public void C(){JOptionPane.showMessageDialog(null, "Метод C");}

//а этот метод использует импортированные константы со всей цепочки наследования интерфейсов
void Show(){JOptionPane.showMessageDialog(null, a_value + b_value + c_value);
}
}



private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Test t = new Test();
t.A();
t.B();
t.C();
t.Show();
}
Категория: Java (Общие вопросы) | Просмотров: 2183 | Добавил: alex | Теги: интерфейс, программирование, реализация интерфейса, Java, разработка программ в Рыбинске | Рейтинг: 5.0/2
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Январь 2013  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей