interface A {
void methodToImplement();
static void someStaticMethod() {
/* code inside */
}
}
...
A.someStaticMethod();
Popírá základní princip, že v rozhraní funkční kód metod není.
Existují dva základní typy metod:
static
default
interface A {
void methodToImplement();
static void someStaticMethod() {
/* code inside */
}
}
...
A.someStaticMethod();
default
Oracle The Java Tutorial: Default Methods |
Výchozí metodu můžeme samozřejmě ve třídách překrýt.
interface Addressable {
String getStreet();
String getCity();
default String getFullAddress() {
return getStreet() +", " + getCity();
}
}
Výchozí metody používáme, když chceme:
přidat novou metodu do existujícího rozhraní
nahradit abstraktní třídu za rozhraní
Statické metody se mohou v rozhraní využít při psaní výchozích metod:
interface A {
static void someStaticMethod() {
/* some stuff */
}
default void someMethod() {
// can call static method
someStaticMethod();
}
}
A
obsahující výchozí metodu defaultMethod()
.
Definujme-li rozhraní B
jako rozšíření rozhraní A
, mohou nastat 3 různé situace:
defaultMethod()
v rozhraní B
nezmiňujeme, pak se podědí z A
.
B
uvedeme metodu defaultMethod()
, ale jen její hlavičku (ne tělo).
Pak ji nepodědíme, stane se abstraktní jako u každé obyčejné metody v rozhraní
a každá třída implementující rozhraní B
ji musí sama implementovat.
B
implementujeme metodu znovu,
čímž se původní výchozí metoda překryje — jako při dědění mezi třídami.
Následující kód se nezkompiluje:
interface A {
default void someMethod() { /*bla bla*/ }
}
interface B {
default void someMethod() { /*bla bla*/ }
}
class C implements A, B {
// compiler does not know which default method should be used
}
Následující kód je zkompiluje:
interface A {
default void someMethod() { /*bla bla*/ }
}
interface B {
default void someMethod() { /*bla bla*/ }
}
class D implements A, B {
@Override
public void someMethod() {
// now we can define the behaviour
A.super.someMethod();
}
}
interface A { void someMethod(); }
interface B { default void someMethod() { /* whatever */ } }
class E implements A, B {
// compiler should or should not use default method?
}
/