当我注意到现在可以在接口中定义静态和默认方法时,我正在通过接口学习。
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
请解释两者的区别,如果有一个我们什么时候会使用它的例子,那就好了。界面上有点混乱。
1.解释两者的区别
静态接口方法类似于静态类方法(这里它们只属于接口)。其中,作为默认接口方法,提供接口方法的默认实现
(实现类可以覆盖
)
但是请记住,如果一个类使用相同的默认方法签名实现多个接口,那么实现类
需要覆盖默认方法
你可以在下面找到一个简单的例子(可以为不同的情况DIY)
public class Test {
public static void main(String[] args) {
// Accessing the static member
I1.hello();
// Anonymous class Not overriding the default method
I1 t = new I1() {
@Override
public void test() {
System.out.println("Anonymous test");
}
};
t.test();
t.hello("uvw");
// Referring to class instance with overridden default method
I1 t1 = new Test2();
t1.test();
t1.hello("xyz");
}
}
interface I1 {
void test();
//static method
static void hello() {
System.out.println("hello from Interface I1");
}
// default need not to be implemented by implementing class
default void hello(String name) {
System.out.println("Hello " + name);
}
}
class Test2 implements I1 {
@Override
public void test() {
System.out.println("testing 1234...");
}
@Override
public void hello(String name) {
System.out.println("bonjour" + name);
}
}
2.我们什么时候用这个就好了。
这取决于你的问题陈述。如果您在该契约中的所有类中都需要对规范中的方法使用相同的实现,或者可以像
Adapter
classes那样使用默认方法,那么我认为默认方法是有用的。
这是一本好书:https://softwareengineering.stackexchange.com/questions/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread
下面是oracle doc解释的默认值
拥有实现用新的默认或静态方法增强的接口的类的用户不必修改或重新编译它们以适应额外的方法。
http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
静态方法是应用于类命名空间的方法。因此,接口的静态方法foo被nterface.foo访问。请注意,函数调用不适用于接口的任何特定实例。
另一方面,默认实现条
,由
Interface x = new ConcreteClass();
x.bar();
静态
接口方法无法知道此
变量,但默认实现可以。
Java8中静态和默认方法的区别:
1)默认方法可以在实现类中重写,而静态不能。
2)静态方法只属于Interface类,因此您只能在Interface类上调用静态方法,而不能在实现此Interface的类上调用静态方法,请参见:
public interface MyInterface {
default void defaultMethod(){
System.out.println("Default");
}
static void staticMethod(){
System.out.println("Static");
}
}
public class MyClass implements MyInterface {
public static void main(String[] args) {
MyClass.staticMethod(); //not valid - static method may be invoked on containing interface class only
MyInterface.staticMethod(); //valid
}
}
3) 类和接口都可以有相同名称的静态方法,并且都不能重写其他方法!
public class MyClass implements MyInterface {
public static void main(String[] args) {
//both are valid and have different behaviour
MyClass.staticMethod();
MyInterface.staticMethod();
}
static void staticMethod(){
System.out.println("another static..");
}
}
问题内容: Java 8在接口上引入了默认方法和静态方法。因此,现在无论使用默认方法还是静态方法,您都可以在界面中实现具体的实现。 Java声称添加这两种新方法的原因是“确保与为那些接口的较旧版本编写的代码二进制兼容”。 我的问题: 为什么为了支持现有的体系结构问题而扭曲应该完全抽象的接口原始概念? 使用抽象类和新版本的接口之间的区别除了一个类具有扩展多个接口的能力之外,还有什么区别? 问题答案:
Java8在接口上引入了默认和静态方法。因此,现在您可以在接口中有具体的实现,不管是使用默认方法还是静态方法。 Java声称添加这两种新方法的原因是“确保与为这些接口的旧版本编写的代码的二进制兼容性”。 null
我有以下场景: 以下是我的问题: 如果中的静态方法是公共的,则编译错误将为: 静态方法m1()与I中的抽象方法冲突。 因此,当访问修饰符是默认值时,它试图隐藏,而当它是公共的时,它是冲突的。为什么会有这样的区别呢?背后的理念是什么?
我试图使用以下代码理解Java接口中的默认方法,但我无法编译它: 编译器生成了以下输出: 我无法理解这些错误。我如何更正代码中的问题?
我想通过创建一个具体实现类的对象来执行接口中默认方法的定义体,该对象也覆盖了该方法。无论我是直接创建具体实现类的对象,还是通过动态绑定/多态,实现类中定义/重写的主体都只是得到执行。请看下面的代码 我想知道如何在控制台内部界面银行打印以下内容--loan()
但是随着缺省方法的引入,接口也具有抽象类的所有功能。因此非静态和非最终字段也是必要的。 但当我尝试正常声明一个字段时,默认情况下它变成了静态的和最终的。 在Java8中有没有一种方法可以在接口中声明一个非静态的非final字段。