java接口和抽象类的异同_抽象类的控制符是什么

java接口和抽象类的异同_抽象类的控制符是什么之前Java接口中的方法默认都是public abstract,成员变量默认都是public static final,偶然发现接口中可以有default类型的方法,才知道java8中接口可以有自己的实现了。那么jdk1.8究竟对接口做了哪些修改呢?(1) 增加default方法。default方法作用范围也是public,只是有了具体实现的方法体。对已有的接口,如果想对接口增加一个新方法,那么需要对所有实现该接口的类进行修改。而有了default方法,可以解决该问题。(2) 新增static方法。st

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

之前Java接口中的方法默认都是public abstract,成员变量默认都是public static final,偶然发现接口中可以有default类型的方法,才知道java8中接口可以有自己的实现了。那么jdk1.8究竟对接口做了哪些修改呢?
(1) 增加default方法。default方法作用范围也是public,只是有了具体实现的方法体。对已有的接口,如果想对接口增加一个新方法,那么需要对所有实现该接口的类进行修改。而有了default方法,可以解决该问题。
(2) 新增static方法。static修饰的方法也是非抽象方法,使用同类的静态方法一样,给方法的调用带来了方便。程序入口main方法也是static,现在接口也可以运行了。
例如下面在InterfaceA中定义了一个default方法,一个static方法:

 public interface InterfaceA { 
   
    default String f(){ 
   
        return"this is InterfaceA";
    }
    static String getName(){ 
   
        return "InterfaceA";
    }
}

那么在实现类中可以直接调用接口的default方法,通过接口名.方法名调用static方法

public class ImplClass implements InterfaceA { 
   
    public static void main(String[] args) { 
   
        System.out.println(new ImplClass().f());
        System.out.println(InterfaceA.getName());
    }
}

结果:

但是注意,如果一个类同时实现了两个拥有相同方法签名(相同的方法名、参数)、返回类型的default方法后,需要在类中重写default方法,否则编译器会因为不知道应该调用哪一个接口中的default方法而报错
再定义一个InterfaceB接口,和InterfaceA接口拥有相同方法签名、返回类型的f()

public interface InterfaceB { 
   
    default String f(){ 
   
       return "this is InterfaceB";
    }
}

ImplClass同时实现InterfaceA和InterfaceB,这时编译器会报错:

重写接口中default方法后,编译器会执行重写后的方法:

 public class ImplClass implements InterfaceA,InterfaceB { 
   
    @Override
    public String f(){ 
   
        return "this is ImplClass";
    }
    public static void main(String[] args) { 
   
        System.out.println(new ImplClass().f());
    }
}

结果:

如果一个类同时继承的父类和实现的接口拥有相同签名、返回类型时,当该类未重写方法,直接调用时,将会调用父类中的方法:
再定义一个父类FatherC,拥有和InterfaceA同签名、返回类型的方法f()

 public class FatherC { 
   
    public String f(){ 
   
        return "this is FatherC";
    }
}

ImplClass实现InterfaceA的同时继承FatherC,未重写方法f(),直接调用时,将会调用父类中的方法:

 public class ImplClass extends FatherC implements InterfaceA { 
   
    public static void main(String[] args) { 
   
        System.out.println(new ImplClass().f());
    }
}

结果:

接口已经越来越向类靠近了,所以现在接口和抽象类的区别有:

  1. 虽然接口和抽象类都不能被实例化,但是抽象类可以有构造器,接口没有构造器
  2. 抽象类单继承(只能继承一个类),接口多继承(能继承多个接口)
  3. 抽象类中方法可以有public、protected、默认(包)甚至private范围的方法,接口只能有public范围的方法(即使是default也是public范围的)
    如有遗漏,欢迎大家补充
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168701.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月8日 下午4:46
下一篇 2022年8月8日 下午4:46


相关推荐

  • c语言 无锁编程,无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)「建议收藏」

    c语言 无锁编程,无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)「建议收藏」1.无锁编程与有锁编程的效率无锁编程,即通过CAS原子操作去控制线程的同步。如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多。CAS实现的是硬件级的互斥,在线程低并发的情况下,其性能比普通互斥锁高效,但是当线程高并发的时候,硬件级互斥引入的代价与应用层的锁竞争产生的代价同样都是很大的。这时普通锁编程其实是优于无锁编程的。硬件级原子操作使应用层的操作变慢,而且无法…

    2022年5月2日
    46
  • 2026AI 生成图片去水印免费工具适配各类内容

    2026AI 生成图片去水印免费工具适配各类内容

    2026年3月15日
    3
  • Java中executeUpdate和executeQuery的区别

    Java中executeUpdate和executeQuery的区别executeQueryexecuteQuery()方法是在PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象,executeUpdate该方法是在PreparedStatement对象中执行SQL语句,该语句必须是一个SQL数据操作语言,例如INSERT,UPDATE,DELETE等语句,或者是没有返回内容的SQL语句….

    2022年10月20日
    3
  • 解决VMware卸载后再安装出现的问题

    解决VMware卸载后再安装出现的问题1 下载 VMwareWorkst 2 问题 下载到本地 双击打开 提示如下点击 ok 提示如下解决方法 1 点击 号 弹出 程序无法继续 此时不要点击 确定 停留在此页面不要关闭 2 打开 cmd 命令 输入 temp 找到带有 setup 文件夹的 打开此文件夹 找到 VMwareWorkst 双击运行即可安装 3 问题 打开文件夹提示没有访问权限解决方法 1 右击文件夹 点击属性 安全 高级 2 点击添加 选择主体 输入用户 检测名称

    2026年3月26日
    3
  • 从0到1打造正则表达式执行引擎(一) 正则表达式转NFA

    从0到1打造正则表达式执行引擎(一) 正则表达式转NFA文章目录前置知识有限状态机状态机下的正则表达式串联匹配并连匹配(正则表达式中的**|**)重复匹配(正则表达式中的**?+***)重复0-1次?重复1次以上重复0次以上匹配指定次数特殊符号(正则表达式中的**.\d\s……**)子表达式(正则表达式**()**)练习题代码实现建图匹配下集预告功能完善化DFA引擎正则引擎优化今天是五一假期第一天,这里先给大家拜个晚年,咳咳!!我…

    2022年7月19日
    25
  • 如何通过 OIDC 协议实现单点登录?[通俗易懂]

    如何通过 OIDC 协议实现单点登录?[通俗易懂]什么是单点登录我们通过一个例子来说明,假设有一所大学,内部有两个系统,一个是邮箱系统,一个是课表查询系统。现在想实现这样的效果:在邮箱系统中登录一遍,然后此时进入课表系统的网站,无需再次登录,课表网站系统直接跳转到个人课表页面,反之亦然。比较专业的定义如下:单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中…

    2022年10月21日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号