国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java8中的default方法詳解

2019-11-26 15:17:18
字體:
供稿:網(wǎng)友

Java 8新增了default方法,它可以在接口添加新功能特性,而且還不影響接口的實(shí)現(xiàn)類。下面我們通過例子來說明這一點(diǎn)。

復(fù)制代碼 代碼如下:

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類實(shí)現(xiàn)了InterfacesA接口的saySomething()方法?,F(xiàn)在我們?yōu)镮nterfacesA接口新增一個(gè)sayHi()方法。這么做的話,MyClass類是無法通過編譯的,除非我們提供了sayHi()的實(shí)現(xiàn)方法。

Default方法是非常有用的,通過在接口定義的方法的訪問修飾符前加上關(guān)鍵字default,那么實(shí)現(xiàn)類就無需提供該方法的實(shí)現(xiàn)了。比如:

復(fù)制代碼 代碼如下:

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方法的實(shí)現(xiàn)。因此,default方法使我們的代碼更加靈活,在接口中也可以寫方法實(shí)現(xiàn)了。實(shí)現(xiàn)的方法會(huì)作為默認(rèn)的方法實(shí)現(xiàn)。
那么,多接口存在沖突該怎么辦?

由于Java類可以實(shí)現(xiàn)多個(gè)接口,那么就可能存在這樣的情況:兩個(gè)或多個(gè)接口都有一個(gè)同名的default接口方法,從而造成沖突。因?yàn)镴ava虛擬機(jī)在程序運(yùn)行時(shí),并不清楚你要使用哪一個(gè)default方法。這會(huì)導(dǎo)致編譯錯(cuò)誤。

讓我們來看看下面的例子。

復(fù)制代碼 代碼如下:

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

它是通不過編譯的,會(huì)報(bào)以下錯(cuò)誤:
“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”
除非在MyClass類中重寫了sayHi()方法:

復(fù)制代碼 代碼如下:

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

如果想指定調(diào)用哪一個(gè)接口的sayHi()方法,我們可以這么做:

復(fù)制代碼 代碼如下:

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

答案是不是很簡(jiǎn)單呢?

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄龙县| 曲阜市| 武川县| 广西| 绿春县| 汾西县| 措美县| 会泽县| 德江县| 上栗县| 汝阳县| 牟定县| 勃利县| 郁南县| 平度市| 潮安县| 遵义县| 谢通门县| 盐津县| 久治县| 土默特左旗| 聂荣县| 安岳县| 安塞县| 曲阜市| 昌平区| 潮州市| 平顺县| 永城市| 都匀市| 张家川| 周至县| 彭水| 文昌市| 莲花县| 无为县| 临邑县| 万年县| 义乌市| 合川市| 富源县|