100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Java接口 基类 抽象类详解(图解接口 继承和实现 基类和抽象类的区别等)——Java基础系列

Java接口 基类 抽象类详解(图解接口 继承和实现 基类和抽象类的区别等)——Java基础系列

时间:2022-10-02 07:27:24

相关推荐

Java接口 基类 抽象类详解(图解接口 继承和实现 基类和抽象类的区别等)——Java基础系列

文章目录

前言总览(必看)一、接口是“契约”二、接口实例——Servlet接口三、抽象标识符abstract和抽象类四、基类作为“辅助”求支持

前言

接口和抽象类?继承和实现?默认方法、静态方法、抽象方法…?这些到底有什么区别和联系?Java新手(包括我这个入门2年的菜鸡)常常都会忽视掉接口的概念,也不会关注抽象类的运用,更别提这两者的差别了…

总览(必看)

对接口、抽象类、基类我做了如下的图来说明:

接口:与其说是不能被实例化的类,更像是一种约定子类可以同时遵守多个约定,实现多个接口

抽象类:是对同类事物共有属性和行为的抽象模板,每个子类只能继承一个模板

基类:是对接口/抽象类默认方法的一般实现,使得子类不需要对接口/抽象类的方法完全重写,更方便使用

一、接口是“契约”

在这里我强调接口是一种“契约”的概念,是从接口这个概念设计的目的出发,尽管从接口的定义方面:如下满足关键字iterface声明,字段内容默认为public static 方法默认public abstract 即可

public interface interfaceName{int STATUS=1;//...void interfaceFunction();//...}

尽管接口定义与一般的类定义差别不但,但是其中字段一般保存不变,方法共有但是不实现这些默认设置,恰巧说明了接口作为“契约”的功能。

声明一个接口——我们使用其静态的字段作为状态标识,默认的方法作为使用该接口的客户和实现该方法的子类的纽带,属于使用者和实现者的约定——这是独属于程序员的浪漫(bushi)

二、接口实例——Servlet接口

Servlet是Java Web开发中较为基础的一个概念,是属于服务器容器和开发者实现后端功能类的一个关键接口

关于Servlet的详细概念和Java Web基础可以参考这篇文章——Java Web 基础之Servlet概念详解

通过上图,我们可以看到Servlet接口,已经默认实现接口功能的基类GenericServlet,然后是Web开发常用类HttpServlet作为子类扩展了Http相关功能。

实现了Servlet接口的类才能被服务器容器识别和部署到服务器上,才能让服务器容器心甘情愿的为开发者设计的类提供服务,Servlet接口就是一种身份标识。

三、抽象标识符abstract和抽象类

有细心的小伙伴可能已经发现了,在接口中所有的方法都默认添加abstract标识,那么这个标识符到底有什么用嘞?

在这里就不得不提到抽象和具体的概念——抽象是现实世界实体的提取概括,不能直接作用于现实世界,具体事物可以由抽象概念组合和创造,可以直接展现使用

因此抽象标识符即表示该方法不能直接使用,需要被子类实现才能使用——同理,抽象类也是如此,抽象类的方法也默认为抽象的方法。具体一个例子如下:

public abstract class Animal{String name;Animal(String name){this.name=name;}@Overridepublic void print(Object document){System.out.println(name);}public abstract void describe();

首先,抽象类可以拥有可变字段和构造方法,而且抽象类还可以继承实现一些父类方法——抽象类可以实现接口方法,抽象类一般用于定义模板,模板方法…比如上面定义了一个动物模板,同样不能实例,但是可以供子类扩展。

四、基类作为“辅助”

在Servlet接口实例中,可以看到——在扩展Servlet接口直接使用时,中间还有一个GenericServlet作为辅助,帮助实现了默认的方法,具体GenericServlet做的工作见下:

abstract class GenericServlet implements Servlet,ServletConfig{//GenericServlet通过将ServletConfig赋给类级变量private trServletConfig servletConfig;public void init(ServletConfig servletConfig) throws ServletException {this.servletConfig=servletConfig;/*自定义init()的原因是:如果子类要初始化必须覆盖父类的init() 而使它无效 这样this.servletConfig=servletConfig不起作用 这样就会导致空指针异常 这样如果子类要初始化,可以直接覆盖不带参数的init()方法 */this.init();}//自定义的init()方法,可以由子类覆盖 //init()不是生命周期方法public void init(){}//实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法 public abstract void service(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException{}//实现空的destroy方法public void destroy(){}}

它实现了一大堆空的方法,它的子类就不必对那须不需要实现的方法再进行实现了,减轻了子类的工作。

求支持

作者长期更新分享原创文章,如果觉得本文还算不错的话,请给我一个大大的赞!!!

如果非常赞同这篇文章,请关注我,持续了解更多精彩博文!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。