关于JAVA中抽象类和接口的区别辨析
今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解。
1 抽象类
用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为。也就是说,抽象类中的方法,需要在子类中进行重写。这样看来,抽象类和一般的父类没什么两样。
什么时候需要使用到抽象类呢?
大家知道,子类继承父类的方法,因为子类自己有特殊性,需要对父类方法进行重写,举最简单的例子
abstract class Person { //定义一个名为人类的抽象类
//以下定义抽象方法,抽象方法只有方法声明 没有方法体;
abstract String Is();
}
class Student extends Tuxing {
public String Is(){//重写父类的方法
return " 我是学生!";
}
}
class Teacher extends Tuxing {
public String Is(){
return " 我是老师!";
}
}
子类(Student和Teacher)继承父类(Person),Person中有作为人的共同方法Is(),在子类中对Is方法进行重写,得出结果。用一般方法编写时,一旦编写子类代码中,忘记对Is方法进行重写,就会输出父类的空方法体,此时程序无报错,但结果已错误。代码不严谨。
此时需要将父类中Is方法加上修饰符abstract,去除方法体,父类类名前加上abstract编译,报错,显示必须对子类中Is代码进行重写。如上代码所示。
以上即可避免代码的错误,保证代码的准确性。
【理解理解】需要讲几点:
1 抽象类,即那个父类,用abstract修饰,后不能加private(加了子类无法继承),抽象类的抽象方法,没有方法体,即括号后直接加分号;
2 抽象类和抽象方法的关系:
抽象类中不一定有抽象方法(编译能成功,但不用抽象方法,就没有使用抽象类的意义了)
有抽象方法的类一定是抽象类(即有抽象方法,对应的那个类也一定要用abstract修饰)但是抽象方法也可以存在在接口当中,注意之间的关系~
3 【重要】抽象类有构造方法(有子类证明有构造方法)但规定不能实例化,不能创建对象
4 抽象类必有子类:抽象类的意义在于子类的重写,所以必有子类
根据这个性质可知abstract和final不能共存
2 接口
定义了类应该遵循的规范,但接口不关心内部数据和方法如何实现。
一个类要实现这个接口(implement),就必须遵循接口中规定的规范(即重写接口中定义的方法)
举个例子说,比如定义了一个名叫手机的接口,里面规定了手机应该具备的功能发短信,此时各手机商创建手机这个实例对象时,都应该遵循手机接口中定义的规范,即都要有发短信的功能,但不同的实际实现这个功能的方法可能不一样。可以看出接口和抽象类的功能基本是一致的。
【重要】实际上,接口就是一种特殊的抽象类。(把接口当做类来理解!)
简单应用如下:
interface ICellPhone{ //定义了一个叫做手机的接口 规范了手机的行为 如有父接口,可以用extends继承父接口
String type = "安卓手机";//默认final类型,记得赋初值
void sendMsg();//默认为抽象方法 可不用写abstract
}
class Huawei implements ICellPhone{
//定义手机 为了实例化出手机对象 用类 implements表示华为手机实现了手机这个规范
public void sendMsg(){ /*此方法前只能加public 因为是重写接口里的sendMsg(),sendMsg()默认为public 子类不能比父类范围小*/
System.out.println("华为发送短信");
}
}
class Xiaomi implements ICellPhone{
public void sendMsg(){
System.out.println("小米发送短信");
}
}
public class JiekouDemo {
public static void main(String[] args) {
String str = ICellPhone.type;//把接口看作类,type是静态变量,他也可以用过类名.变量名来访问
ICellPhone hu = new Huawei();hu.sendMsg();
hu = new Xiaomi();hu.sendMsg();
}
}
【重要 结合具体代码理解】
接口的语法 :
[public] interface 接口名 [extends 父接口名]
可以看出,接口有继承性,是一种特殊的类,编译结果为.class(把接口看做类,好理解)
接口的特点 :
接口内方法都是抽象的,默认为abstract public(可不写)
接口内变量都是全局变量,默认为public static final
接口可以继承接口,但不继承类。
子类只能继承一个父类(extends),但可以实现多个接口(implemnets)。
注意措辞,类是继承,接口是实现。
3 接口和抽象类的区别
同:都位于继承的顶端,用于被其他实现或继承;
都不能实例化;(不能new)
都有抽象方法,子类中必须对父类方法进行重写
异:抽象类中有一般方法(用于适配器模式,详解见下篇),接口中仅有抽象方法
4 选择
既然抽象方法和接口有很多相似的地方,那如何选择呢?
优先选用接口,尽量少用抽象类;(接口的抽象性比抽象类更彻底,因为抽象类中还可以有其他类)
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类(就是说 一个功能子类要做,父类也要做,即模板模式);
5 学习JAVA 多写代码多理解 一起加油加油~
关于JAVA中抽象类和接口的区别辨析的更多相关文章
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- Java中抽象类和接口的区别?
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- java中抽象类、接口及区别
转自:http://www.cnblogs.com/dolphin0520/p/3811437.html 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没 ...
- Java 中抽象类与接口的区别
TypeScript 中的接口,有点类似抽象类的概念.Java 中抽象类属于包含属性与抽象行为,而接口通常只是抽象行为.抽象类可以实现模板模式. 参考 https://www.cnblogs.com/ ...
- 转载:详细解析Java中抽象类和接口的区别
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
- Java中抽象类和接口的区别
转载自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种 ...
- 详细解析Java中抽象类和接口的区别
在Java语言中, abstract class 和interface 是支持抽象类定 义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和in ...
- 详细解析Java中抽象类和接口的区别(转)
转自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机 ...
- [转]详细解析Java中抽象类和接口的区别
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
随机推荐
- Cocoa 新的依赖管理工具:Carthage
昨天搞了一下pod的安装 因为之前我都是在使用pod来进行第三方库的管理 但是拿到项目之后 竟发现这个前辈是用Carthage 说真的在这之前我从来没有用过这个玩意因为我感觉用POD已经很好了啊 很方 ...
- 文字在div中水平和垂直居中的的css样式
文字在div中水平和垂直居中的的css样式 text-align:center; /*水平居中*/ line-height: 20px; /*行距设为与div高度一致*/ 示例如下: HTML元素 & ...
- javascript实现页面滚屏效果
当我们浏览网页的时候,时常会碰到可以滚动屏幕的炫酷网页,今天笔者对这一技术进行简单实现,效果不及读者理想中那般炫酷,主要针对滚屏的技术原理和思想进行分享和分析.本示例在页面右侧有五个数字标签,代表五个 ...
- Apriori算法原理总结
Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策.比如在常见的超市购物数据集,或者电商的网购数据集中,如果我们找到了 ...
- A tutorial on Principal Components Analysis | 主成分分析(PCA)教程
A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components A ...
- 对于Java泛型的理解
源起:查看COLLECIOTNS类 Q1:为什么java需要泛型? 因为java对于对象类型的确认在编译期,那么强制类型转换就可以通过编译,但是运行时的错误却无法避免,那么泛型的存在可以避免强制类型转 ...
- maven 配置安装
1.下载maven http://maven.apache.org/ 2.windows安装maven 解压包后配置环境变量 PATH:%M2_HOME%\bin M2_HOME:D:\soft\ ...
- 一个普通底层.NET程序员关于职场瓶颈期的思考,辗转自我提升/跳槽/转行之间
徒有工龄,没技术没学历没平台没家底,工作几年,无车无房无存款还前景不明. 时常有身边的亲友问怎么学开发怎么转互联网,说起IT行业都说工资高,动辄月薪上万动辄年薪几十万. 再看看自己,我可能是假的程序员 ...
- 关于nodejs express4.X框架不支持layout模板的问题解决
网上有有种方法是安装express-partials模块,然后在 app.set(‘view engine’, ‘ejs’); 这句后面加上app.use(partials());但是,经过我的反复尝 ...
- "table" is not mapped 解决方法
现象:使用hql="from person" 出现" person is not mapped " 错误 配置文件如下:<hibernate-mappin ...