接口是什么,java接口是干什么用的

接口是什么,java接口是干什么用的 引对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。那么,java中抽象类和接口的区别是什么?本文我们将详解Java中

对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。

那么,java中抽象类和接口的区别是什么?本文我们将详解Java中接口和抽象类的区别。

抽象类:Java中被abstrac关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法是特殊的方法:只有声明,没有具体实现。例如:

package com.yiyi.vx.test;

//  抽象类
public abstract class Demo {
    //  抽象方法
    public abstract void method1();
}

如果一个类中含有抽象方法,那么这个类一定是抽象类,且必须由abstract关键字对类进行修饰。java语法规定抽象类不能被实例化

---得到结论A.抽象类不能被实例化

刚刚也有提到,当一个类中含有抽象方法时,那这个类一定是抽象类。但是抽象类不一定含有抽象方法。

---得到结论B.包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;

没有抽象方法的抽象类有啥作用呢?

无抽象方法的抽象类HttpServlet源码如下所示:

public abstract class HttpServlet extends GenericServlet {
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }

    }

    protected long getLastModified(HttpServletRequest req) {
        return -1L;
    }

    protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if (DispatcherType.INCLUDE.equals(req.getDispatcherType())) {
            this.doGet(req, resp);
        } else {
            NoBodyResponse response = new NoBodyResponse(resp);
            this.doGet(req, response);
            response.setContentLength();
        }

    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_post_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }

    }

    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_put_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }
    }
    .....
}

可以看出,它的默认方法均为非抽象方法。但它却是实实在在以abstract修饰的抽象类。这么做,就可以让它的子类在继承后,选择性的去复写抽象类的方法,这样就更加灵活和便捷,不需要复写的方法就不会在子类进行一个复写操作。

从这里可以看出,抽象类本身就是为了继承而存在的,如果创建了抽象类而不去继承它复写它的方法的话,那么这个抽象类就白创建了。

---得到结论C.抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;

抽象类还有两个其他特性:

D.一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;

E.抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用

接口:Java中接口使用interface关键字修饰,特点为:

a、接口可以包含变量、方法;变量被隐式指定为public static final,使用private修饰编译器会报错。而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法

b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;

c、一个类可以实现多个接口;

d、JDK1.8中对接口增加了新的特性:(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。

如下例子所示:

public interface Person{
  public static final int a=10;
  //JDK1.8
    default void sayHello(){
        System.out.println("Hello World");
    }
    public void say();
}
public abstract class Person{
  public abstract void say();
  public void eat(){};
}

如上述代码所示:

接口只能是功能的定义,而抽象类既可以为功能的定义也可以为功能的实现。

接口与抽象类的区别

相同点

(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/34499.html

(0)

相关推荐

  • 恐惧之泣八项修改器

    恐怖之哭八项修改器是专为同名游戏《恐惧之泣》打造的游戏辅助工具,玩家可以用它为自己提供游戏帮助,更好地体验这款生存恐怖类游戏。 修改器包含无限生命、无限耐力、无限弹药、无限弹夹、轻...

    2022年11月10日
  • 保卫萝卜3国庆活动攻略4(保卫萝卜4七夕主题活动玩法攻略第五关)

    保卫萝卜4七夕主题活动将于8月2日启动。玩家完成“睡兔,潜龙主题”20级后即可开启。活动期间,完成关卡挑战任务,收集玫瑰花,即可获得七夕有限奖励。那么今天边肖就为大家介绍保卫萝卜4...

    2022年8月1日
  • 问道手游电精怎么样,问道手游电精和火鸦

    问道手游电精进化小鸟一次能成功吗? 宠物的进化需要一步一步去实现。 首先电精的携带等级应该是65级,那么就可以随便抓一个携带等级为70级的宠物,归元洗成宝宝去进化。然后再随便抓一个...

    阅读 2022年7月23日
  • 重庆初级经济师证书有哪些作用

    初级经济师证作用更大。1.可以作为工作证明。2.获得升职加薪的机会。3.可以作为求职的加分项。4.自己的工作会有更多的优势。先来了解一下初级经济师证的作用。 初级经济师证书的作用 ...

    2022年3月12日
  • 宅基地上不能种什么树,农业用地可以种树吗

    宅基地栽树又改种地可以吗?网友提问:宅基地栽树又改种地可以吗?优质回答:严格来讲,宅基地是不可以用来种树或种地的。但在农村,在宅基地上种树或者种地的情况有很多,可以说是屡见不鲜。出现这种情况的原因,基本上都属于一户多宅的

    攻略 2021年12月23日
  • 时间猎人3最新礼包兑换码9月分享

    猎人3最新礼包兑换码有哪些?很多玩家想用礼包兑换码进行各种兑换,但是又不知道最新的礼包兑换码是什么,所以我在9月份给大家带来了时间猎人3的最新礼包兑换码分享。有兴趣就来看看吧! 时...

    2022年9月28日