Java8的default方法詳解
版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/42612023
Java 8的default方法詳解
作者:chszs,轉載需註明。部落格主頁:http://blog.csdn.net/chszs
Java 8新增了default方法,它可以在介面新增新功能特性,而且還不影響介面的實現類。下面我們通過例子來說明這一點。
public class MyClass implements InterfaceA {
public static void main(String[] args){
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
}
interface InterfaceA{
public void saySomething();
}
上面的程式碼顯示了MyClass類實現了InterfacesA介面的saySomething()方法。現在我們為InterfacesA介面新增一個sayHi()方法。這麼做的話,MyClass類是無法通過編譯的,除非我們提供了sayHi()的實現方法。
Default方法是非常有用的,通過在介面定義的方法的訪問修飾符前加上關鍵字default,那麼實現類就無需提供該方法的實現了。比如:
public class MyClass implements InterfaceA {
public static void main(String[] args){
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
}
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi");
}
}
要注意,我們必須提供所有的default方法的實現。因此,default方法使我們的程式碼更加靈活,在介面中也可以寫方法實現了。實現的方法會作為預設的方法實現。
那麼,多介面存在衝突該怎麼辦?
由於Java類可以實現多個介面,那麼就可能存在這樣的情況:兩個或多個介面都有一個同名的default介面方法,從而造成衝突。因為Java虛擬機器在程式執行時,並不清楚你要使用哪一個default方法。這會導致編譯錯誤。
讓我們來看看下面的例子。
public class MyClass implements InterfaceA, InterfaceB {
public static void main(String[] args){
MyClass mc = new MyClass();
mc.sayHi();
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
}
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB{
default public void sayHi(){
System.out.println("Hi from InterfaceB");
}
}
它是通不過編譯的,會報以下錯誤:
“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”
除非在MyClass類中重寫了sayHi()方法:
public class MyClass implements InterfaceA, InterfaceB {
public static void main(String[] args){
MyClass mc = new MyClass();
mc.sayHi();
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
@Override
public void sayHi(){
System.out.println("implemetation of sayHi() in MyClass");
}
}
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB{
default public void sayHi(){
System.out.println("Hi from InterfaceB");
}
}
如果想指定呼叫哪一個介面的sayHi()方法,我們可以這麼做:
public class MyClass implements InterfaceA, InterfaceB {
public static void main(String[] args){
MyClass mc = new MyClass();
mc.sayHi();
}
@Override
public void saySomething() {
// TODO Auto-generated method stub
}
@Override
public void sayHi(){
InterfaceA.super.sayHi();
}
}
interface InterfaceA{
public void saySomething();
default public void sayHi(){
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB{
default public void sayHi(){
System.out.println("Hi from InterfaceB");
}
}
答案是不是很簡單呢?
相關文章
- Java 8中的default方法使用詳解Java
- oracle: default role 詳解(轉)Oracle
- Java8 新特性詳解Java
- ?Java8新特性之Lambda表示式,函式式介面,方法引用和default關鍵字Java函式
- Java8特性詳解 lambda表示式(一):使用篇Java
- MySQL 5.7 Invalid default value for 'CREATE_TIME'報錯的解決方法MySql
- Java8 常用方法Java
- Java8——方法引用Java
- JavaScript中的export、export default、exports和module.exports(export、export default、exports使用詳細)JavaScriptExport
- Java8特性詳解 lambda表示式(三):原理篇Java
- Java8特性詳解 lambda表示式(二):流式處理中的lambdaJava
- super()方法詳解
- java方法詳解Java
- java8(二)方法引用Java
- Java8 預設方法Java
- jQuery的bind()方法用法詳解jQuery
- Adapter的getView方法詳解APTView
- Java中的main()方法詳解JavaAI
- Java中的方法引用詳解Java
- canvas arc()方法詳解Canvas
- canvas closePath()方法詳解Canvas
- toJSON()方法詳解JSON
- API模板方法詳解API
- Android中的onWindowFocusChanged()方法詳解Android
- 詳解 awk 工具的使用方法
- MogDB-openGauss default privileges 使用方法
- 詳解equals()方法和hashCode()方法
- java8 新特性之方法引用Java
- Pandas中resample方法詳解
- $AJAX方法詳解(轉載)
- jQuery stop()方法用法詳解jQuery
- $.ajax()方法引數詳解
- import方法引入模組詳解Import
- rman使用方法詳解
- android StartActivityForResult()方法詳解Android
- 05.Java 方法詳解Java
- js陣列方法詳解JS陣列
- 程式碼混淆的原理和方法詳解