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范围的)
    如有遗漏,欢迎大家补充
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • struts2 拦截器和过滤器理解

    struts2 拦截器和过滤器理解学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下。          过滤器,是在javaweb中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do

  • js中怎么使点击按钮后文本框获得焦点

    js中怎么使点击按钮后文本框获得焦点

  • linux网卡的fec功能,网络控制器驱动程序学习记录fec(1)

    linux网卡的fec功能,网络控制器驱动程序学习记录fec(1)1,首先从模块加载函数module_init(fec_enet_module_init);staticint__initfec_enet_module_init(void){structnet_device*dev;inti,j,err;DECLARE_MAC_BUF(mac);printk(“FECENETVersion0.2\n”);for(i=0;(i<…

  • 动态规划算法解01背包问题(思路及算法实现)

    动态规划算法解01背包问题(思路及算法实现)说明:算法源自教材。本文相当于对教材做的一个笔记(动态规划与贪心算法解01背包必须先对背包按照单位重量的价格从大到小排序,否则拆分的子问题就不具备最优子结构的性质)动态规划算法:动态规划就是一个填表的过程。该表记录了已解决的子问题的答案。求解下一个子问题时会用到上一个子问题的答案。{比如01背包问题:假如有1个背包,背包容量是10,有5个物品,编号为1,2,3,4,5,他们都有各自的…

  • Java 内存模型

    Java 内存模型

  • kernel dma protection_系统感知进程的唯一实体是

    kernel dma protection_系统感知进程的唯一实体是为BCG界面库的记忆特性所晕倒同事使用BCGControlBarPro处理界面,今天在修改菜单资源时却发生一件很奇怪的事情:无论怎么修改,程序运行后始终显示的还是改动以前的菜单,多次清空临时文件、生成文件以及重新编译也无济于事。同事为此折腾了一个上午,郁闷得不行。我用UltraEdit搜索了一下整个工程,并没有发现以前的字符串资源,因此排除了是编译器的问题。不是编译器的问题,那么就只能是BCG的问题了,我怀疑是BCG对资源进行了“记忆”处理,为了验证这一想法,我让同事将新生成的程序拷贝到一台没有使用过该程序

发表回复

您的电子邮箱地址不会被公开。

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