浅谈Java中接口与抽象类的异同
浅谈Java中接口与抽象类的异同
抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似。期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别。硬着头皮,做出一波小总结。或许,学习了之后的知识,理解会更加深刻吧,奥利给!
语法上的区别
一个类最多只能继承一个抽象类,但是可以继承多个接口。
接口中的变量声明默认是final的,但是抽象类中可以包含非final的变量。
接口中的成员必须都是public的,而抽象类的成员可以是普通类成员的常用风格,即public,private和protected都可以修饰。
接口应用关键字
implements来实现,抽象类应使用关键字extends进行扩展。一个普通类要是想要实现一个接口,就必须实现接口中的所有方法,但是继承抽象类的情况,可以让继承类用abstract修饰,从而不直接实现抽象类中的抽象方法。
接口只能继承接口,而抽象类能继承其他类或者多个接口,且抽象类可以在不提供接口方法实现的情况下实现接口。
抽象类中可以拥有构造方法,但不能用于创建实例,仅仅供子类去调用构造方法而已。而接口中不允许有构造方法。
深入理解
- JDK1.8之前,接口中全部为隐式抽象方法,不能有具体方法实现, 而抽象类可以有普通方法;JDK1.8之后,接口是允许声明默认方法或静态方法来提供具体的方法实现的。
在默认方法在接口中出现之前,抽象类相比于接口有一个明显的优势在于:有更好的前向兼容性(forward-compatibility),即在不破坏既有代码的情形下继续在类中添加新的功能。但是默认方法的出现,让接口也能够实现这个效果。这个在上一篇提到过:浅谈Java的默认和静态方法
- 抽象类是面向"对象"的,它需要提供的是"对象"应该具有的基本属性或基本的功能行为,就像人具有年龄的属性,会干活等等。从相同抽象类继承的对象享有相同的基本特征,学生,老师,警察叔叔……他们都具有年龄,也都会干活,无非是可能大家年龄不同,干的活不一样罢了。而这些其实就是一种"is-a"的概念,也就是"学生类是人类的一种"。
abstract class People{
private int age;
public abstract void doSomething();
}
- 而接口是面向"功能"的,它需要定义对象具有的功能,而不管是什么对象,我只需要知道你能干什么就行,我才不管你是谁。就像学习的功能,不管是机器还是学生都具备,他们就可以就都可以实现这个接口,而不关心他们自身的类型。那么一个对象的功能或者技能肯定是很多的,这时,接口的多实现就显得非常的合理。不同于"is-a"的关系,接口代表的是一种"has-a"的概念,表示"对象具有学习的技能"。
interface studyable {
void howToStudy();
default void info() {
System.out.println("study is important for everyone..");
}
}
- 接口和抽象类都可以实现多态,多态的好处有目共睹,利用向上转型及动态绑定,即在运行时才确定对象的类型,大大增加了扩展性。
public static void main(String[] args) {
studyable[] studyables = new studyable[]{new Robot(), new Student()};
for (studyable s : studyables) {
s.howToStudy();
s.info();
}
System.out.println("*************************************");
People[] peoples = new People[]{new Student(), new Teacher()};
for (People p : peoples) {
p.doSomething();
}
}
//测试结果
Robot comes out
Student comes out!
robot need to practice
study is important for everyone..
student will read book..
study is important for everyone..
*************************************
Student comes out!
Teacher comes out!
student should study..
teacher should teach..
参考链接:what is the difference between an interface and abstract class
浅谈Java中接口与抽象类的异同的更多相关文章
- 浅谈java中接口与抽象类之间的异同
刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...
- Java中接口与抽象类的异同
定义(以下是百度百科中的定义): Java接口:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具 ...
- java中接口和抽象类的异同点
抽象类和接口的区别:A:成员区别 抽象类: 成员变量:可以变量,也可以常量 构造方法:有 成员方法:可以抽象,也可以非抽象 接口: 成员变量:只可以常量,默认修饰符:public static fin ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
随机推荐
- oracle函数 current_date
[功能]:返回当前会话时区中的当前日期 [参数]:没有参数,没有括号 [返回]:日期 [示例]select current_date from dual; 返回:2008-11-14
- oracle函数 current_timestamp
[功能]:以timestamp with time zone数据类型返回当前会话时区中的当前日期 [参数]:没有参数,没有括号 [返回]:日期 [示例]select current_timestamp ...
- 【[Offer收割]编程练习赛15 A】 偶像的条件
[题目链接]:http://hihocoder.com/contest/offers15/problem/1 [题意] [题解] 把3个数组的元素全都合并在一个数组里面; (当然你要记录每个数字原本是 ...
- Linux系统服务及软件包的管理
要点回顾 free命令查看内存 整理buffer与cache的作用 1.buffer(缓冲) 是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的. 2.cache(缓存) 从CPU ...
- shell awk杂项
awk '{ ;++i<=NF;){ a[i]=a[i]?a[i]",'\''"$i"'\''":"'\''"$i"'\'' ...
- supersockets服务器配置热更新
Keywords: 配置,热更新 此功能能够允许你在不重启服务器的前提下更新服务器实例的配置. (仅限1.6.5及其以上版本)
- [C++] 自动关闭右下角弹窗
最近腾讯.迅雷等各种客户端,都越发喜欢在屏幕的右下角弹框了. 有骨气的人当然可以把这些软件卸载了事,但是这些客户端在某些情况下却又还是有用的.怎么办呢? 作为码农,自己实现一个自动关闭右下角弹窗的程序 ...
- Java反射机制(三):调用对象的私有属性和方法
一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...
- C# 递归、try
一.递归 递归:在函数体内调用本函数自身,直到符合某一条件不再继续调用 两个需要满足的条件1.有反复调用自身函数的过程2.有函数的出口:有不再继续执行的条件 例子: 案例: (一).输入正整数n,求n ...
- H3C CHAP验证配置示例一