JDK8.0接口中的默认方法和静态方法

我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method();

类在实现接口的时候必须重写抽象方法才可以

jdk8中新加的默认方法和静态方法是什么呢?

可以通俗理解:静态方法属于类,调用静态方法通过接口名曲调用它,默认方法在实现类中可以重写,可以不重写

;默认方法,在接口中定义,区别抽象方法,有方法体
public interface DefaultStaticInterface {
    //普通方法,类实现接口必须重写它
    abstract void Method();

    //默认方法在类实现接口时候可以不重写,也可以重写
    public default void defaultMethod() {
        System.out.println("这是接口定义的默认方法,实现接口可以不重写他");
    }

    ;

    //静态方法是属于接口的,调用它必须用接口调用
    public static void staticMethod() {
        System.out.println("这是接口的静态方法");
    }

    ;

}
//探索静态方法 默认方法是否可以被继承
interface ExtendInterface extends DefaultStaticInterface{
    void speak();
}

class Test implements DefaultStaticInterface {
    @Override
    public void Method() {
        System.out.println("重写了类中定义的抽象方法Method");
    }

    @Override
    public void defaultMethod() {
        System.out.println("这里选择性的重写了了接口中的默认方法defaultMethod()");
    }

    //静态方法,通过接口定义
    public static void main(String[] args) {
        //静态方法的调用
        DefaultStaticInterface.staticMethod();
        Test test = new Test();
        test.Method();
        test.defaultMethod();
    }
}
class Test01 implements ExtendInterface{
    @Override
    public void speak() {
        System.out.println("重写speak方法");
    }

    @Override
    public void Method() {
        System.out.println("重写父类中的抽象方法");
    }

    @Override
    public void defaultMethod() {
        System.out.println("重写父类接口中的默认方法");
    }
    //可以知道,子类接口中的默认方法是可以继承的,但是静态方法始终是属于父类接口的,通过父类接口调用
    public static void main(String[] args) {
        Test01 test01=new Test01();
        test01.Method();
        test01.defaultMethod();
        DefaultStaticInterface.staticMethod();

    }
}

原文地址:https://www.cnblogs.com/doudou2018/p/9637696.html

时间: 2024-10-01 02:54:21

JDK8.0接口中的默认方法和静态方法的相关文章

Java8接口中的默认方法

Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8开始支持lambda表达式,可以把函数当做参数传递,最明显的lambda表达式应用场景莫过于对collection的每一个元素应用lambda.如果想为Collection实现lambda表达式:list.forEach(…); // 这就是lambda代码 首先想到的是为Collection的父接

Java 8——接口中个的默认方法和静态方法

在Java SE 8之前,interface只是事物的抽象,用来定义统一的抽象事物和描述事物的抽象行为和属性. 但是在Java SE 8中,增加了可以在interface中增加默认实现的行为和事物的静态行为. 一.为什么? java迭代了如此多的版本且主要采用的都是演化的思想而非重构(为了保证与历史的兼容性). 这样就容易出现很多比较难以处理的问题,接口在发布之后就已经被定型,除非我们能够一次性更新所有该接口的实现.比如某个历史接口有很多实现,需要在历史接口中增加一个行为,那么久需要在它的所有实

Java 8-接口的默认方法和静态方法

Java 8-接口的默认方法和静态方法 Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法.默认方法使得接口有点类似traits,不过要实现的目标不一样.默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法. 默认方法 默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要.接口提供的默认方法会被接口的实现类继承或者覆写,例子代码如下: private interface Defaulable

java中的默认方法

在[0.3.1 Java简介]中,有这么一段话:“请注意:Java并非作为教学语言设计的.世界各地的大学在讲授Java的过程中均遇到一些教学上的困难(如Java语言和API的快速升级),这些困难是计算机科学教育中一般性的挑战.” Java8中引入的默认方法,充分展示了Java平台概念的一致性与JDK向前兼容之间的矛盾,而且以牺牲概念的一致性而满足JDK向前兼容. 1.理想与现实 [曾经]Java接口纯粹是契约的集合,是一种程序设计的表达方式.从数据抽象的角度看,能够在不定义class的同时又可以

java中,一个类实现某个接口,必须重写接口中的所有方法吗

不一定,关键要看子类是否是抽象类.如果子类是非抽象类,则必须实现接口中的所有方法: 如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在!1.抽象类定义抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象.通常在编程语句中用 abstract 修饰的类是抽象类.在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象:在java中,含有抽象方法的类称为抽象类,同样不能生成对象.抽象类是不完整的,它只能用作基类

java8-新特性--(接口的默认方法与静态方法)

Java 8用默认方法与静态方法这两个新概念来扩展接口的声明. public interface Inte{ void method(); default void defaultMethod(){ System.out.println("default"); } static void staticMehod(){ System.out.println("static"); } }   public static void main(String[]args){

浅谈python中的一般方法、静态方法(staticmethod)和类方法(classmethod)

我们先来简单谈谈python类中一般方法.静态方法和类方法的区别. 1.类中的一般方法 一般方法在定义的时候,需要有表示类实例的参数(通常以self表示,例如def foo(self,arg1,arg2--)),一般方法不能通过类名.方法名()来调用,必须先创建类的实例,然后通过实例.方法名()来调用. 2.类中的静态方法 类中的静态方法用"@staticmethod"来修饰,静态方法在定义的时候,不需要表示类的实例,可想类外的方法定义一样.静态方法可以通过类名.方法名()和实例.方法

java如何区分同时继承的父类和实现的接口中相同的方法

问题是这样的:一个父类中有一个方法,一个接口中有一个与父类方法重名的方法,现在子类中要同时继承父类和实现接口,那么应该怎么区分子类的方法是重写的父类的还是实现的接口的. 基类代码: public class Father { public Father() { System.out.println("基类构造函数{"); show(); System.out.println("}"); } public void show() { System.out.printl

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最近看了一下java 8的一些新特性,其中最重要的莫过于Lambda表达式了,通过一阵子的学习,原本准备自己写一篇博客的,后来阅读了一位学长翻译过来的博客(原文是Brain Goetz的State of Lambda,下面会给出原文链接),觉得写的十分完美,把我想要写的和我没想到的都罗列了出来,就把这个分享给大家了. 注:原译文见  http://lucida.me/blog/java-8-lambdas-insideout-language-features/ 英语原版见:http://cr.