理解面向对象抽象类和接口

一、抽象类

1、什么叫抽象类

例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的。所以动物就是所谓的抽象类,猫和狗则是具体的类了。因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类。

抽象类的作用?

抽象类主要解决的代码复用的问题
 

2、抽象类的特点

  • 抽象类与抽象方法必须用abstract关键字进行修饰。
  • 抽象类不一定会有抽象方法,而有抽象方法的类一定是抽象类。
  • 抽象类不能实例化,若需实例化,参照多态的形式,通过子类来进行实例化。
  • 继承了抽象类的子类,则需要重写抽象类里面的所有抽象方法,要么就是抽象类才行。
     

 3、成员特点注意

成员变量:可以是变量或者常量。
构造方法:有构造方法,但是不能实例化,则需要通过多态子类来进行;其中用处是为子类访问父类来进行数据初始化。
成员方法:可以是抽象类:限定 子类必须完成的某些行为;也可以为非抽象类,可以提高代码的复用性。

抽象类的定义格式:

abstract class 抽象类名称{
	属性;
	访问权限 返回值类型 方法名称(参数){//普通方法
		return 返回值;
	}
	访问权限 abstract 返回值类型 方法名称(参数);//抽象方法
	//在抽象方法中是没有方法体的
}


 

注意:抽象类和普通类主要有三点区别:

 1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

 2)抽象类不能用来创建对象;

 3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

 在其他方面,抽象类和普通的类并没有区别。

二、接口

接口的基本概念

接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。
接口的作用:

1、可以使项目分离,所有层都面向接口开发,提高开发效率;

2、接口使代码和代码之间的耦合度降低,变得可插拔,可以随意切换;

3、接口和抽象类都能完成某个功能,优先选择接口,因为接口可以多实现,多继承,并且一个类除了接口之外,还可以继承其它类。
 

接口的使用

1、由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:
(1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口;
(2)接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法;
(3)接口的对象可以利用子类对象的向上转型进行实例化。

接口与类相似点:

  • 一个接口可以有多个方法。
  • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  • 接口的字节码文件保存在 .class 结尾的文件中。
  • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

接口的声明
接口的声明语法格式如下:

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

Interface关键字用来声明一个接口。

 接口有以下特性:

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  • 接口中的方法都是公有的。

 接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

实现一个接口的语法,可以使用这个公式:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

重写接口中声明的方法时,需要注意以下规则:

1.类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
2.类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
3.如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
在实现接口的时候,也要注意一些规则

1.一个类可以同时实现多个接口。
2.一个类只能继承一个类,但是能实现多个接口。
3.一个接口能继承另一个接口,这和类之间的继承比较相似。
 

三、抽象类与接口的区别

语法层面上的区别:

  1. 一个类只能继承一个抽象类,而一个类却可以实现多个接口
  2. 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
  3. 抽象类可以提供成员方法的实现细节,而接口中的方法不可以
  4. 接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法
  5. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
  6. 接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象, 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

设计层面上的区别:

  1. 抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
  2. 继承是一个 "是不是"的关系,而接口实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。
  3. 设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值