IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java进阶-JDK1.8新特性:新增接口方法 -> 正文阅读

[Java知识库]java进阶-JDK1.8新特性:新增接口方法

新增接口方法

概述

JDK1.8之前,接口中的方法都必须是抽象方法,实现接口的类,必须实现接口中定义的每一个抽象方法。因此出现了一个问题,如果在程序设计过程中,设计了一个接口,其中包含两个方法,这个接口被多次实现并引用,在后续升级过程中,发现需要在接口中新增多个方法的定义,那么实现该接口的类也必须重写该接口中所有的方法吗?

为了解决该问题,JDK1.8中引入了一种新的机制:接口可以支持在声明方法的同时,提供实现。用到的方式就是在接口中定义默认方法和静态方法。实现含有默认方法或者静态方法的接口的类可以继承这些方法并直接使用,不再需要强制在实现类中去实现(重写)接口中的方法了。

默认方法

interface Firstinterface{
	//抽象方法
	void before();
	//默认方法
	default void test(){
		System.out.println("Default默认方法被调用了");
	}
}

//实现类
class FirstClass implements FirstInterface{
	@override
	public void before(){
		Systemo.out.println("实现类中的抽象方法被调用了");
	}
}

public class DefaultMethod{
	public static void main(String[] args){
		FirstClass fc = new FirstClass();
		fc.test();//调用的是默认的方法,即便实现类中没有实现该默认方法,也可以直接调用
		fc.before(); //调用的抽象方法,实现类必须实现
	}
}

默认方法的优势

1、升级接口(添加方法声明)可以更加方便。不必随着接口方法增加,从而修改实现代码,因为默认方法在子类中可以不用实现。
2、可以让实现类中省略很多不必要方法的空实现。

接口继承及使用默认方法可能带来的冲突

默认方法调用的规则

Java中一个类只能继承一个父类,但是可以实现多个接口。由于Java 8中,接口里面的方法可以直接进行实现,那么类也就可以从多个接口中继承这些方法。

规则如下:

  • 1、类中声明的方法优先级最高。类或方法中,声明的方法要高于任何默认方法的优先级
  • 2、如果无法依据第一条进行判断,那么子接口的优先级更高
  • 3、如果还是无法判断,那么继承了多个接口的类,必须通过实现(重写)方法来确定方法的调用

(1)例如:类C,实现两个接口A、B,其中接口B继承接口A

interface A{    
	default void test(){   
		System.out.println("A接口中的Default方法");   
	}
}
interface B extends A{    
	default void test(){        
		System.out.println("B接口中的default方法");   
	}
}

class C implements A,B{   
 	public static void main(String[] args){        	
 		C c = new C();        
 		c.test();    
 	}
 }

运行结果:B接口中的default方法
//子接口的优先级最高,所以是调用B接口的默认方法

(2)例如:类C,继承父类A,实现接口B

class A{    	
	public void test(){   
		System.out.println("A类中的Default方法");   
		}
	}
interface B {default void test(){
	    System.out.println("B接口中的Default方法");   
	}
}
class C extends A implements B{    
	public static void main(String[] ar	gs){        
		C c = new C();        
		c.test();   
	}
}

A类中的Default方法

(3)例如,类C,实现两个接口A、B,但是A和B之间没有子父接口关系

interface A{    	
	default void test(){   
		System.out.println("Default Method test in A");   
	}
}
interface B {    
	default void test(){        
		System.out.println("default method test in B")
	}
}

class C implements A,B{    
	public void test(){        
		//如果在C中需要显示访问A/B的默认方法,可以使用接口名.super.方法名();        
		A.super.test();        
		B.super.test();        
		//或者自己编写test方法的实现   
	}
}

静态方法

和类中定义的静态方法类似,**接口中的静态方法可以直接通过 接口名.静态方法名 的形式进行访问。**接口中的静态方法,只能使用当前接口的名字来调用。

public interface StaticMethod{
    public static void test(){
    	System.out.println("我是StaticMethod接口中的静态方法!");
   	}
}
  	
class A implements StaticMethod{}

class Test{
    public static void main(String args[]){
        //运行成功
        StaticMethod.test();        
        //编译报错:        
        //Static method may be invoked on containing interface class only        
        //A.test();   
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:57:54  更:2022-03-03 16:03:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:41:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码