java 接口 抽象类

本文详细介绍了Java中抽象类和接口的概念及其区别。抽象类是对一类对象的整体抽象,适用于有共性的类,可以有非抽象方法。接口则更侧重于行为规范,一个类可以实现多个接口,接口中只能有public static final变量和public abstract方法。通过实例说明了抽象类和接口在实际编程中的应用选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽象类

先来了解抽象类的概念 : 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.
这样可能不好理解,我们可以举个例子,比如在自然界中有许多东西都是三角形的,但可以是直角三角形,广角三角形等等,因此我们可以将三角形写成一个抽象类,各种类型的三角形继承三角形这个父类的特性.
再举一个代码的例子,创建一个动物类

public class animal{
    public void bark(){}
}

我们可以看到动物类中有一个方法,“bark()”
这时我们创建一个猫类(继承动物)

publi class cat extend animal{
     public void bark(){
        System.out.println("喵喵");
     }
}

再创建一个狗类

publi class dog extend animal{
     public void bark(){
        System.out.println("汪汪");
     }
}

我们可以从上述代码中可以看出,猫和狗类都对动物中的"bark()"方法进行了重写,那么就产生了一个问题,cat可以"喵喵"叫,狗可以"汪汪"叫,但动物怎么叫?很明显实例化一个动物类是没有任何意义的.
因此我们把动物类写成

public abstract class animal{
    public abstract void bark(){}

当然这并不意味着在抽象类中就只能存在抽象方法,抽象类和实体类的区别主要在于,
1.抽象类中的抽象方法只能用public或protected修饰.
2.抽象类不能创建对象,即不能实例化.
3.如果一个类继承于一个抽象类,那么子类必须实现父类的抽象方法.否则,子类继承的方法还是抽象方法,子类也变成了抽象类,要用abstract修饰.(类似于生物界中的分类,科下面有属,属下面有种)

接口

接口,英文interface,在软件工程中,接口泛指供别人调用的方法或者函数.从这里我们可以看到接口的主要目的是对行为的抽象.
接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法.从这里我们可以看出抽象类和接口的不同了,接口更像是更加抽象的一种抽象类.
可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法.

区别

具体区别
1抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法.
2抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的.
3接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法.
4一个类只能继承一个抽象类,而一个类却可以实现多个接口.

当然这样不便理解,我们通过上述例子已经可以认识到抽象类是对整体的类的抽象,而接口是一种行为规范.
例如,鱼和船本身并没有太多共同点,但它们都有"游"这个特点,我们可以设计一个 swim接口,含swim()方法,鱼和船都可以根据需求实现这个方法,如果再增加船的种类,去继承船就行.
网上有一个很适合理解的代码例子,门和警报的例子

abstract class Door {
    public abstract void open();
    public abstract void close();
}

门类,包含"open()","close()"方法

interface Door {
    public abstract void open();
    public abstract void close();
}

门接口
我们这时要给门加一个警报方法"alarm()",
有两种解决方案,一种是给抽象类门加入"alarm()"
还有一种是给接口门加入"alarm()"
若采用第一种方案,则所有的门都会有警报功能,这与事实相悖了,采用第二种方案,那么所有有警报功能的类都要实现"open()“与"close()”,这也与事实相悖了,因为类如火灾报警器并不存在一个"开关"功能.
所以最好的思路便是把alarm单独写成一个接口,让有警报需求的类去继承它.

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}

希望对你有帮助
参考
http://blog.youkuaiyun.com/xw13106209/article/details/6923556
https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E7%B1%BB/4748292?fr=aladdin
https://www.jb51.net/article/122723.htm

全能批量打印是一款综合性的文件批量打印软件,可打印AutoCAD、Office Word/Excel/PPT、Wps Word/Excel/PPT、PDF、XPS、图片、TXT文件,程序设置简单、操作便捷,方便打印人员快速打印文件。 Windows操作平台支持:WinXP~Windows10版本(32位、64位)及对应的服务器系统。 AutoCAD版本支持:2006及以上各版本(含通用版、机械版、建筑版等)。图框可为块(包括外部参照)、矩形多段线、矩形直线段、无图框。程序能自动快速准确识别各类型图框,并能自动根据图框尺寸选择不同纸张图幅打印(如A2,A3,A2加长等),以满足各种打印人员的需要。程序能自动识别图框旋角度,自动设置打印比例,并可实现按图框配置(范围内文字、图框属性)顺序打印,在AutoCAD内外均可实现批量打印。 文档(Word、WPS)文件打印支持Microsoft Office及WPS各版本文件,根据需要设置打印页码范围,选择打印机后可直接进行打印。 表格(Excel、ET)文件打印支持Microsoft Office及WPS各版本文件,可根据需要选择需要打印的Sheet以及页码范围。 文稿(PPT、DPS)文件打印支持Microsoft Office及WPS各版本文件,根据需要设置打印页码范围,选择打印机后可直接进行打印PDF文件可自动识别标准纸张, 根据需要设置纸张和打印页码范围,选择打印机后可直接进行打印,无需安装PDF阅读器。 图片、TXT文件根据需要设置纸张,选择打印机后可直接进行打印。 【软件特点】 AutoCAD打印 1、打印纸张支持加长图框; 2、智能识别无图框文件; 3、可自动识别标准宽度图框打印到不同纸张; 4、可调整图框打印比例及图框打印边距设置适应纸张可打印区域; 5、支持多种图框样式,满足不同需求,可通过选择不同的识别模式适应任意图框大小的识别; www点setetn点 com 6、支持Adobe PDF直接保存至文件; 7、支持图框按配置进行排序(可进行多文件全部排序)。 文档、表格、文稿、PDF、XPS、图片、TXT文件打印 1、支持打印机单双面、黑白彩色设置; 2、支持Adobe PDF直接保存至文件; 3、表格文件打印支持多种打印范围(当前表、所有表、所有未隐藏表、有颜色表名工作表、依据工作表名过滤); 4、PDF、XPS打印支持自动识别标准纸张。 联系QQ920832078
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值