程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java8中的default辦法詳解

Java8中的default辦法詳解

編輯:關於JAVA

Java8中的default辦法詳解。本站提示廣大學習愛好者:(Java8中的default辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java8中的default辦法詳解正文


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");
 }
}

謎底是否是很簡略呢?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved