接口的旧特性:

就特性下接口中只有:

常量(必须赋值)

抽象方法abstract(和final static private三个关键字冲突)

interface Inter {
//int a ; //编译报错 常量必须要赋值不能使用默认值。
int a = 10; // 前面有默认修饰符 public static final
//void show(){} //编译报错 抽象方法必须没有方法体
void show(); //前面有默认修饰符 public abstract
}

接口的新特性:

新特性在旧特性的基础上新加了

非抽象方法

interface Inter {
//非抽象方法 必须给出 default 关键字
public default void method1(){ // 你给了default 前面就不会再有 默认修饰符 public abstract
}
}

静态方法

interface Inter {
//静态方法
public static void method2(){// 你给了static 前面就不会再有 默认修饰符 public abstract }
}

静态私有方法

interface Inter {
//静态私有方法
private static void method2(){// 你给了static 前面就不会再有 默认修饰符 public }
}

非静态私有方法。

interface Inter {
//非静态私有方法。
private void method1(){ // 你给了private 前面就不会再有 默认修饰符 public abstract
}
}

非静态的非抽象方法:

它的出现解决接口升级问题。1万个类实现了一个接口,这时候对接口进行了升级,按照jdk1.7的规则,加方法的话只能加

抽象方法,当加完抽象方法之后1万个类瞬间编译报错。因为必须要重写抽象方法。

有的时候我们希望1万个类如果有类想升级那么重写,有类的不想升级就别重写了。这时候default来了。

案例1:

interface Inter {
public default void show(){
System.out.println("show");
}
}
class Student implements Inter { }
public class Test {
public static void main(String[] args){
//Inter i = new Inter(); //编译报错。 接口就算是jdk1.8也不能创建对象啊。
//i.show(); //Inter.show(); // 编译报错。因为default方法不是静态不能用类名调用.
// default 就不是给你接口准备的, Student s = new Student();
s.show(); Inter i = new Student();
i.show(); // 多态除了 重写的方法 是调用的子类之外, 其他的所有的东西 都是调用的父类 父类没有那就只能报错了。
}
}

案例2:

interface Inter {
default void show(){ //前面不写public的话 默认有
System.out.println("show");
}
}
class Student implements Inter {
void show(){ // 编译报错 子类重写重写父类的方法 权限修饰符 必须大于等于父类的权限修饰符
System.out.println("zi show");
}
}
public class Test {
public static void main(String[] args){
Student s = new Student();
s.show(); //
}
}

案例3:

interface Inter1 {
void method();
public default void show(){
System.out.println("show1");
}
}
interface Inter2 {
void method();
public default void show(){
System.out.println("show2");
}
}
class Student implements Inter1,Inter2 { // 多实现的规则 继续沿用。 但是 规定了 当一个类实现了多个接口,而多个接口中出现了 一样的 default方法, 那么子类必须重写,谁都不用
public void method(){ // 这也是 接口可以多实现的原因
System.out.println("method");
}
public void show(){
System.out.println(" zi show");
}
}
public class Test {
public static void main(String[] args){
Student s = new Student();
s.method(); // method
s.show(); //zi show
}
}

静态方法:

作用:让接口具备了功能, 让接口来调用。

案例1:

interface Inter {
public static void show(){ //
System.out.println("show");
}
}
class Student implements Inter { }
public class Test {
public static void main(String[] args){
Student s = new Student();
s.show(); // 编译报错。 接口的静态方法 不是给儿子准备的。 儿子用不了。 Inter.show();
}
}

案例2:

class Person {
public static void show(){ //
System.out.println("show");
}
}
class Student extends Person { }
public class Test {
public static void main(String[] args){
Student s = new Student();
s.show(); // show 正确的, 类的静态方法, 子类是可以调用的。
}
}

案例3:

class Person {
public static void show(){ //
System.out.println("fu show");
}
}
class Student extends Person {
public static void show(){ //
System.out.println("zi show");
}
}
public class Test {
public static void main(String[] args){
Person p = new Student();
p.show(); // zi show 静态的方法 不存在重写, 是谁的 就是谁的。
}
}

案例4:

interface Inter1 {
void method();
public static void show(){
System.out.println("show1");
}
}
interface Inter2 {
void method();
public static void show(){
System.out.println("show2");
}
}
class Student implements Inter1,Inter2 {
public void method(){ // 这也是 接口可以多实现的原因
System.out.println("method");
} // Student 作为接口的子类 是无法使用接口的静态方法的, 所以 多实现接口的时候 随便有多少个相同的静态方法。
}
public class Test {
public static void main(String[] args){
Student s = new Student();
s.method(); // method
s.show(); //编译报错
}
}

私有方法:

可以把多个非静态的非抽象方法 或者 多个静态方法 的共性的内容 抽取成一些静态方法。

interface Inter {
public static void show1(){
show3();
}
public static void show2(){
show3();
}
private static void show3(){
System.out.println("show");
System.out.println("show");
} public default void method1(){
method3();
show3();
}
public default void method2(){
method3();
show3();
}
//private default void method3(){ // 编译报错。 你只要写了default 前面绝对默认是 public的 改不了。 你却private 冲突了。
//void method3(){ // 编译报错。 啥都不写 前面默认是public abstract的
private void method3(){ // 你写了 private之后 就不再有 publica bstract了 也不再有default了
System.out.println("method");
System.out.println("method");
}
}
class Student implements Inter { }
public class Test {
public static void main(String[] args){
Student s = new Student();
s.method3();// 编译报错。 私有的
Inter.show3(); // 编译报错。 私有的
}
}

JDK1.8之后的新特性和新接口的更多相关文章

  1. JDK1.8新特性——使用新的方式遍历集合

    JDK1.8新特性——使用新的方式遍历集合 摘要:本文主要学习了在JDK1.8中新增的遍历集合的方式. 遍历List 方法: default void forEach(Consumer<? su ...

  2. 乐字节-Java8新特性之函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  3. Firefox 23中的新特性(新陷阱)

    话说有一天突然发现我们的网站页面上的JQuery功能都失效了,Firebug中显示如下的错误 Blocked loading mixed active content "http://xxx ...

  4. java7新特性 java8新特性

    Java 7 的7个新特性 Java7语法新特性 JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm

  5. HTML5 的新特性以及新标签的浏览器兼容问题

    新特性: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 1)  拖拽释放(Drag and drop) API 2)  语义化更好的内容标签(heade ...

  6. hadoop3.0新特性及新功能

    Hadoop-3.0.0-alpha2版本发布,相比之前的hadoop-2.x有一系列的功能增强.但目前还是个alpha版本,有很多bug,且不能保证API的稳定和质量. 主要变化 Java最低版本要 ...

  7. [PHP7.0-PHP7.2]的新特性和新变更

    php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...

  8. Kubernetes1.3新特性:新的资源回收控制器

    (一)  核心概念 在kubernetes1.3中新增了一个资源回收控制器GarbaseCollector,用这个控制器来替代kubernetes1.3中的资源回收控制器GC. 如下为kubernet ...

  9. 再来看看Java的新特性——其他新特性

    关于剩余Java8新特性知识点总结,包含:默认方法.Optional.CompletableFuture.时间相关. 默认方法 默认方法皆在帮助Java新功能可以兼容低版本JDK已开发的程序. 比如说 ...

随机推荐

  1. @InitBinder 前端传递date时间类型属性时,转换错误问题

    在Controller里加上这段代码 @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomE ...

  2. 总结web开发的四大域

    一.HttpSession域: 1.作用域范围: 一次会话. 数据产生后,使用后,如果还需要继续使用的情况下,HttpSession域 2.HttpSession作用: 在第一次调用request.g ...

  3. Ceph BlueStore与FileStore:利用Micron NVMe SSD进行性能比较

    https://www.micron.com/about/blog/2018/may/ceph-bluestore-vs-filestoreblock-performance-comparison-w ...

  4. vue基础七

    事件处理器 1.监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. <div id="example-1"> <butto ...

  5. 【Flutter学习】基本组件之进度条(LinearProgressIndicator, CircularProgressIndicator)

    一,概述 基本有两种类型: 条形进度条(LinearProgressIndicator) new LinearProgressIndicator( backgroundColor: Colors.bl ...

  6. BZOJ 4545

    bzoj 4545 给定一个踹树,支持几种操作. 本质不同子串询问 加入子树 询问字符串\(S\) 在树上的出现次数. 好码好码 重点就是维护\(parent\) 树,考虑用\(LCT\)维护此树. ...

  7. 《ArcGIS Runtime SDK for .NET开发笔记》--在线编辑

    介绍 ArcGIS可以发布具有编辑功能的Feature Service.利用Feature Service我们可以实现对数据的在线编辑. 数据制作参考: https://server.arcgis.c ...

  8. MySQL 时间戳与日期格式的相互转换(转)

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 输出:2006-08-22 12:11:10 2.日期转换为U ...

  9. 58、salesforce学习笔记(五)

    Set集合 Set<String> set1 = new Set<String>(); set1.add('1'); set1.add('2'); Set<String& ...

  10. HP Server BIOS实验报告

    原文链接http://www.hpiss.com/3924.html 注意:红色字体为HP手册中查找到的资源,及个人感觉应该注意的一些信息,个人翻译的也为红字体,网络中自行查找到的资源,以及询问各位师 ...