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

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


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

相关推荐

  • Django(18)聚合函数

    Django(18)聚合函数前言orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像Sum、Avg、Count、Max、Min,接下来我们逐个介绍聚合函数所有的聚合函数都是放在django.db.models

    2022年7月28日
  • spring的配置文件-applicationContext.xml

    spring的配置文件-applicationContext.xml1.<beans>标签是spring的配置文件的根标签,其包含相关的命名空间,用于约束子标签的标识<?xmlversion=”1.0″encoding=”UTF-8″?><beansxmlns=”http://www.springframework.org/schema/beans”xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xmlns:aop=”http://www.s

    2022年7月13日
  • linux重启网卡的命令行,linux系统怎么重启网卡?linux重启网卡的三种教程

    linux重启网卡的命令行,linux系统怎么重启网卡?linux重启网卡的三种教程在实际工作中,经常会遇到Linux系统进行重启网卡的操作。在这里整理一下,进行多种方法的网卡重启。一、servicenetworkrestart1、首先用CRT工具连接到Linux命令行界面。或者进入操作系统界面,选择终端输入。2、如果我们对所有的网卡进行重启操作。可以尝试输入:servicenetworkrestart命令进行操作。3、样就完成了用servicenetworkr…

    2022年9月22日
  • c语言createthread函数用法,CreateThread函数「建议收藏」

    c语言createthread函数用法,CreateThread函数「建议收藏」当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做例如以下步骤:1在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回2把线程退出码置为STILL_ACTIVE。把线程挂起计数置13分配context结构4分配两页的物理存储以准备栈。保护页设置为PAGE_READWRITE。第2页设为PA…

    2022年7月11日
  • 第一个Java程序—HelloWorld[通俗易懂]

    第一个Java程序—HelloWorld[通俗易懂]工欲善其事必先利其器,在写第一个Java程序之前,需要安装JDK以及配置环境变量,具体步骤见Windows中配置Java环境变量。环境变量搭建完成了,是不是已经迫不及待想敲几行代码跑跑看?走起!1.在英文路径下创建一个记事本文件,命名为HelloWorld.java。这个文件是存放java代码的文件,称为源文件。这里是将文件类型改为java类型,并不单单是名字。这里的.java是文件类型,有的电脑上可能文件后缀名给隐藏了,虽然文件名里有.java但不是个java文件。可以点击查看,将文件扩展

    2022年7月9日
  • leetcode-403. 青蛙过河(动态规划|记忆化搜索)[通俗易懂]

    leetcode-403. 青蛙过河(动态规划|记忆化搜索)[通俗易懂]一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k – 1、k 或 k + 1 个单位。 另请注意

    2022年8月9日

发表回复

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

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