国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 东方市| 满洲里市| 安康市| 巴楚县| 顺平县| 阿瓦提县| 额尔古纳市| 怀宁县| 工布江达县| 凤翔县| 金华市| 罗山县| 麻江县| 兴安盟| 襄城县| 炎陵县| 瓦房店市| 尚志市| 门头沟区| 毕节市| 建湖县| 灵台县| 吐鲁番市| 滕州市| 林芝县| 宁武县| 澄城县| 黔西| 内黄县| 罗甸县| 玉树县| 施甸县| 和田县| 江门市| 龙门县| 松原市| 固始县| 浮山县| 宿迁市| 太和县| 新安县|