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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java串口通信

    java串口通信java串口通信,由于没有相应的串口硬件,选了一款windows串口虚拟机机器1.准备串口模拟器LaunchVirtualSerialPortDriver下载地址模拟两对四个串口,

    2022年7月1日
    22
  • docker 镜像导入导出_镜像导出

    docker 镜像导入导出_镜像导出Docker镜像的导入导出本文介绍Docker镜像的导入导出,用于迁移、备份、升级等场景,准备环境如下:CentOS7.0Docker1.18导入导出命令介绍涉及的命令有export、import、save、loadsave命令dockersave[options]images[images…]示例dockersave-…

    2025年12月5日
    4
  • decide your linux OS is GUI or not「建议收藏」

    decide your linux OS is GUI or not

    2022年2月4日
    42
  • 【期末复习】微机原理与接口技术

    【期末复习】微机原理与接口技术知识重点整理第一章输入/输出系统1.接口电路的作用和基本功能接口电路是CPU与外设交换信息的中转站。接口电路应具备的功能为:数据缓冲功能、联络功能、寻址功能、数据转换功能、中断管理功能。2.端口的概念和分类端口是接口电路中能与CPU直接进行信息交换的寄存器,即I/O端口寄存器。在接口电路中,按端口寄存器存放信息的物理意义可划分为数据端口、控制端口和状态端口:数据端…

    2022年10月2日
    3
  • 5g 网络切片 边缘计算_5g网络切片技术前景

    5g 网络切片 边缘计算_5g网络切片技术前景紧接上文接入网RANRAN切片提供了基于切片ID的AMF/UPF选择,并提供了相对静态的资源控制和优先级控制。此外,RAN通过RIC(RANIntelligentControl,通过E2接口连接gNB)实现了针对动态资源调度和优先级控制等的实时闭环控制。关于RAN切片的基本机构可参照下图优先级控制在未适用网络切片前,显然,gNB并不能针对UE的不同服务做不同的优先级控制。在适用了5G的网络切片后,运营商就能就能通过不同的网络切片在无线侧调度不同的优先级(这是显而易见的,哈哈)。譬如UE1用高优

    2022年9月26日
    5
  • TCP Flags标志位介绍[通俗易懂]

    TCP Flags标志位介绍[通俗易懂]传输控制协议(TransmissionControlProtocol,TCP)是一种传输层协议。TCP使数据包从源到目的地的传输更加顺畅。它是一种面向连接的端到端协议。每个数据包由TCP包裹在一个报头中,该报头由10个强制字段共20个字节和一个0到40字节的可选数据字段组成。如下图所示:来自于https://www.geeksforgeeks.org1.源端口号(SourcePort):16bits,该字段标识发送方应用程序的端口号。2.目…

    2022年7月16日
    19

发表回复

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

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