【接口】JDK8之前与之后的区别

JDK8以前:

1.接口的基本概念
接口定义:接口就是全局常量和抽象方法的结合,在Java中使用interface定义。接口的命名一般以I开头。
子类实现接口,必须使用implements关键字来实现接口。子类命名一般以Impl结尾。
与类不同的是,一个子类可以实现多个接口,如果子类不是抽象类,那么子类必须覆写接口的全部方法。


实现接口:

interface IMessage{
	public static final String MSG = "HELLO";//全局变量
	public abstract void print();//抽象方法
}

interface INews{
	public abstract String getNew();
}

class MessageImpl implements IMessageINews{
	public void print(){
		System.out.println(MSG);
	}
	public String getNew(){
		return  IMessage.MSG;
	}
}

public class Ex1(){
	public static void main(String args[]){
		IMessage msg = new MessageImpl();
		msg.print();//只能使用IMessage定义的方法
		//父接口的相互转换,和向下转型有点像,先找一个公共子类,建立联系
		//同 INews news = new MessageImpl();
		INews news =INews)msg;
		news.getNew();
	}
}

如图:在这里插入图片描述
实现接口与抽象类:

interface IMessage {
    //public static final String MSG = "hello";
   String MSG = "hello";// static final 在接口中这些修饰符之所以可以不写
    void play();
}

abstract class News{
    public abstract void getMsg();
}


class MessageImpl extends News implements IMessage{
    public void play(){
        System.out.println("lalala");
    }

    @Override
    public void getMsg() {
        System.out.println(MSG);
    }
}

public class Ex2 {
    public static void main(String[] args) {
        IMessage msg = new MessageImpl();
        msg.play();
        News news = (News)msg; //News news = new MessageImpl();
        //可以理解为News news = new MessageImpl();
        news.getMsg();
    }
}

接口之间可以相互继承:

interface A{
	void playA();
}

interface B{
	void playB();
}

interface C extends A,B{
	void playC();
}

class Cimpl implents C{
	public void playA(){
		System.out.println("A");
	public void playB(){
		System.out.println("B");
	public void playC(){
		System.out.println("C");
	}
}

public class Ex3 {
    public static void main(String[] args) {
        C c = new CImpl();
        c.playA();
        c.playB();
        c.playC();
    }
}

2.接口的使用限制:

  • 接口中只允许public权限。(不管是属性还是方法,其权限都是public)
  • 在接口中public、static、final、abstract均可省略不写。
    阿里编码规约:接口中的方法和属性不要加任何修饰符号,public也不要加,保持代码的简洁性。
  • 当一个子类需要实现接口与抽象类时,先用extends继承一个抽象类,再用implements继承多个接口。
  • 一个抽象类可以用implements实现多个接口,但是接口不能继承抽象类。
interface IMessage{
	void print();
}

abstract class News implements  IMessage{
	public void getNews();
}

class MessageImpl extends News{
	public void print(){
		System.out.print("IMessage");
	}
	public void getNews(){
		System.out.println("News");
	}
}
public class Ex4{
	public static void main(String args[]){
//		MessageImpl是抽象类和子类的共同子类
		IMessage m = new MessageImpl();
		m.print;
		News news = (News)m;
		news.getNews();
	}

}

JDK8以后:

早期版本的接口已经有很多子类实现了,后来发现接口中的方法需要改动甚至新增方法,但由于接口是由全局常量+静态方法组成,无法修改,所以将接口作了扩充:

  1. 支持default定义的普通方法,通过子类调用,并且所有子类均拥有此方法。

  2. static定义的静态方法,通过接口名称直接调用。

/*
JDK1.8以后接口的新特性
*/
interface ISubject{
    void test();
    //此处default表示接口中的普通方法
    default void fun(){
        System.out.println("接口中的普通方法,通过子类对象调用");
    }
    //看到static就知与对象无关
    static void fun1(){
        System.out.println("可以通过接口直接调用");
    }
}
class SubjectImpl implements ISubject{

    @Override
    public void test() {
        System.out.println("接口中的抽象方法");
    }
}

public class Test1 {
    public static void main(String[] args) {
        ISubject subject = new SubjectImpl();//通过子类向上转型
        subject.test();
        subject.fun();
        ISubject.fun1();
    }
}

整体来讲,接口感觉更像抽象类了,但是比抽象类更强大的在于:接口的子类依然可以实现多继承的关系,而抽象类依然保持单继承。
因为时间一长,许多的支持就会出现问题(量大的问题),这个时候为了解决这种扩充的问题,才追加了此类支持。但是此操作不属于标准设计,属于挽救设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring5 是一个重要的版本,距离SpringFramework4差不多四年。在此期间,大多数增强都是在 SpringBoot 项目中完成的。在本文中,我们将很快了解到Spring5发行版中的一些令人兴奋的特性。 1. 基准升级 要构建和运行 Spring5 应用程序,你至少需要 J2EE7 和 JDK8。以前的 JDKJavaEE 版本不再支持。 JavaEE7 包含: Servlet 3.1 JMS 2.0 JPA 2.1 JAX-RS 2.0 Bean Validation 1.1 与 Java 基准类似,许多其他框架的基准也有变化。例如: Hibernate 5 Jackson 2.6 EhCache 2.10 JUnit 5 Tiles 3 另外,请记下各种服务器最低支持版本。 Tomcat 8.5+ Jetty 9.4+ WildFly 10+ Netty 4.1+ Undertow 1.4+ 2. 兼容 JDK9 运行时 Spring5 发行版与 JDK9 发行日期非常接近。目标是让 Spring Framework5 在 JDK9 的 GA 之后正确运行。 Spring5 版本的候选版本已经在 classpath 和 modulepath 上支持 Java9 了。 GA版本中你可以期待良好的 JDK9 支持。 3. 使用 JDK8 特性 获取免费Spring 5 新特性视频详解可以群:554355695 在 Spring4.3 之前JDK基准版本是6。所以 Spring4 必须支持 Java6,7 和8,为了保持向后兼容性, Spring 框架没有适应 Java8 带来的许多新特性,比如 lambda 表达式。 Spring5 的基准版本为8,因此它使用了 Java8 和9的许多新特性。例如: Spring 接口中的默认方法 基于 Java8 反射增强的内部代码改进 在框架代码中使用函数式编程 - lambda表达式 和 stream流 4. 响应式编程支持 响应式编程是 SpringFramework5.0 最重要的特性之一。响应式编程提供了另一种编程风格,专注于构建对事件做出响应的应用程序。 SpringFramework5 包含响应流(定义响应性API的语言中立尝试)和 Reactor(由Spring Pivotal团队提供的 Reactive Stream 的Java实现), 以用于其自身的用途以及其许多核心API。 Spring Web Reactive 在 spring-webmvc 模块中现有的(而且很流行)Spring Web MVC旁边的新的 spring-web-reactive 模块中。 请注意,在 Spring5 中,传统的 SpringMVC 支持 Servlet3.1 上运行,或者支持 JavaEE7 的服务器。 5. 函数式web框架 除了响应式功能之外,Spring5 还提供了一个函数式Web框架。它提供了使用函数式编程风格来定义端点的特性。 该框架引入了两个基本组件:HandlerFunction 和 RouterFunction。 HandlerFunction 表示处理接收到的请求并生成响应的函数。 RouterFunction 替代了 @RequestMapping 注解。它用于将接收到的请求路由到处理函数。例如: RouterFunction route = route(GET("/hello-world"), request -> Response.ok().body(fromObject("Hello World"))); 6. Kotlin支持 Kotlin 是一种静态类型的JVM语言,它让代码具有表现力,简洁性和可读性。 Spring5.0 对 Kotlin 有很好的支持。 7. 移除的特性 随着 JavaJavaEE 和其他一些框架基准版本的增加,SpringFramework5 取消了对几个框架的支持。例如: Portlet Velocity JasperReports XMLBeans JDO Guava

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我顶得了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值