default是在java8中引入的关键字,也可称为Virtual extension methods——虚拟扩展方法。
它是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。
我们原来在写Java接口的时候,是不能有方法体的函数,就类似于C++中的虚函数,default关键字在接口中修饰方法时,方法可以有方法体。
interface test{
default public void print() {
System.out.println("This is a interface with default");
}
}
原来的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
我们可以使用一个实验类来调用接口中定义的default方法
public class Defaulttest implements Test {
public static void main(String[] args) {
Defaulttest test01 =new Defaulttest();
test01.print();
}
}
运行结果:
这里我们补充一个带有default方法的接口:
interface Test01{
default public void print() {
System.out.println("This is the second interface with default");
}
}
这里我们在测试类里同时实现这两个接口:
public class Defaulttest implements Test,Test01 {
public static void main(String[] args) {
Defaulttest test01 =new Defaulttest();
test01.print();
}
}
然而我们就会发现编译器会报错,编译无法通过。
这个时候就是人脑胜于电脑的时刻,编译器被搞混了,对于新创建的对象去实现的print方法,编译器不知道该去实现哪个接口的print方法。
然而我就想实现这个print方法那咋办呀?解决办法就来了。
在Defaulttest类中重写print方法来达到我们的目的。
public class Defaulttest implements Test,Test01 {
public void print() {
System.out.println("The print() belongs to Defaulttest");
}
public static void main(String[] args) {
Defaulttest test01 =new Defaulttest();
test01.print();
}
}
运行结果:
如果我这个时候继续创建一个类来继承我的这一个Defaulttest类,如下:
class Defaulttest02 extends Defaulttest implements Test{
public static void main(String[] args) {
Defaulttest02 test=new Defaulttest02();
test.print();
}
}
执行的是Defaulttest类里的print还是接口Test里的print?
答案是Defaulttest类里的print方法
运行结果如下:
类优先于接口
执行一次性备份wbadmin start backup -backuptarget:g: -include:c:,d:,e: -allcritical -systemstate -quiet执行计划备份wbadmin enable backup -addtarget:h: -include:c:,d:,e: -allcritical -syste...
aspx.net不停机升级It seems like some days, our devices rule our lives and the distractionsnever end. Fortunately, you can manage interruptions with AndroidLollipop so you don’t have to turn off your phon...
keyPressEvent是QWidget里面的函数,所以凡是继承自QWidget的类都可以通过实现这个函数来完成对按键事件的响应。要让当前的widget能够响应按键事件,最先需要做的事情是,调用:构造函数加入setFocusPolicy(Qt::StrongFocus);头文件class DebugDialog : public QDialog{ Q_OBJECTpublic: explicit DebugDialog(QWidget *parent ..
最近研究了一下两大开源人脸识别算法:insightface和facenet,包括算法效果与性能,facenet使用的是较早的softmax,Python3环境,基于tensorflow实现;insightface使用的是18年出的arcface,Python2环境,基于mxnet实现。关于不同loss函数的区别,可以参看人脸识别损失函数综述(附开源实现)算法效果比较算法层面上,使用最新的arcface比相对较早的facenet的效果是要好的,在megaface这个高难度赛事上也证明了这一点。在lfw
自动补全代码(双击tab)ctor: 自动补全构造函数prop: 自动补全成员属性cw: 自动补全Control.WriteLIne()快捷键Ctrl + K + S : 代码块添加标签快捷键Ctrl + M + O: 折叠所有方法Ctrl + M + L: 展开所有方法Ctrl + M + M: 折叠或者展开当前方法 Alt + ↑ (Alt +↓)...
获取上个月当前日期函数:RSARCH_DATE_SHIFT
问题及代码:定义二叉树的链式存储结构,实现其基本运算,并完成测试。要求:在main函数中完成测试,包括如下内容: (1)用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建如图的二叉树用于测试。 (2)输出二叉树 (3)查找值为’H’的节点,若找到,输出值为’H’的节点的左、右孩子的值 (4)求高度二叉树高度
windowserver2019下安装oralce11.2g下解决出现INS-30131错误
蛇形填数。在n*n方阵里填入1,2,...,n*n,要求填成蛇形,输入为一个整数n,输出为一个方阵。例如n=4时方阵为: 10 11 12 1 9 16 13 2 ...
本文转载自公众号 InfoQ颜值高,技术水平却不低;力气小,努力程度却不少;数量少,所起作用却不小。没想到,你是这样的女程序员!写在最后在做这期以女程序员为主题的漫画小剧场时,我跟极客邦科技的三个可爱女程序员们聊了聊,搜集了网络、知乎上部分女性程序员的工作与生活诉求,同时采访了技术圈出名的两位美貌与智慧并重的女程序员:新浪微博移动端资深研发专家邱晨、链家网移动端架构师郭晓铭,漫画脚本由此三易其稿,...
MongoDB是开源文档数据库,提供共性能、高可用、自动扩展等。MongoDB中记录是文档,其是字段和值组成的对结构。MongoDB文档类似JSON对象,字段的值可以包含其它文档、数组、文档的数组。记录组织成collection,相当于表。参考下图:使用文档的优点是:文档对应很多编程语言的内生数据对象内嵌文档和数组减少了join的开销动态schema支持顺畅多态关键功能:高性能:mongodb提供...
图片来源于网络边缘计算在产业落地的思考2019年8月22日2018、2019年边缘计算被全球最大的IT咨询公司Gartner评为十大战略性科技。边缘计算将在对时延、带宽、...