Язык 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(); }
|