浅谈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中接口与抽象类的异同的更多相关文章

  1. 浅谈java中接口与抽象类之间的异同

    刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...

  2. Java中接口与抽象类的异同

    定义(以下是百度百科中的定义): Java接口:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具 ...

  3. java中接口和抽象类的异同点

    抽象类和接口的区别:A:成员区别 抽象类: 成员变量:可以变量,也可以常量 构造方法:有 成员方法:可以抽象,也可以非抽象 接口: 成员变量:只可以常量,默认修饰符:public static fin ...

  4. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  5. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

  6. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  7. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  8. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  9. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

随机推荐

  1. oracle函数 NLS_LOWER(x[,y])

    [功能]返回字符串并将字符串的变为小写; [参数]x字符型表达式 [参数]Nls_param可选,指定排序的方式(nls_sort=) . SCHINESE_RADICAL_M(部首.笔画) SCHI ...

  2. OpenStack组件系列☞glance简介

    Glance项目提供虚拟机镜像的发现,注册,取得服务. Glance提供restful API可以查询虚拟机镜像的metadata,并且可以获得镜像. 通过Glance,虚拟机镜像可以被存储到多种存储 ...

  3. Ubuntu 14.04 使用ntfs-config解决开机自动挂载NTFS分区的方法

    先安装: sudo apt-get install ntfs-3g ntfs-config 再配置一下: sudo ntfs-config 然后就会弹出来一个对话框,选择你需要挂载的分区,点应用,再选 ...

  4. canvas+js实现验证码功能

    转载自:https://blog.csdn.net/qq_42463851/article/details/90755734<!DOCTYPE html> <html> < ...

  5. linux包之nmap之ncat命令

    [root@ka1che225 ~]# which nc/usr/bin/nc[root@ka1che225 ~]# which ncat/usr/bin/ncat[root@ka1che225 ~] ...

  6. 在SuperSocket中启用TLS/SSL传输层加密

    关键字: TLS, SSL, 传输层加密, 传输层安全, 证书使用, X509Certificate SuperSocket 支持传输层加密(TLS/SSL) SuperSocket 有自动的对TLS ...

  7. SuperSocket根据条件获取 Session

    如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer ...

  8. 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积

    介绍关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论: 1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional network ...

  9. mybatis查询无结果, 数据库运行相同sql查询出结果

    一.问题描述 mybatis查询无结果, 数据库运行相同sql查询出结果, 如下 这是数据库记录 这是mybatis查询出的结果, 记录条数0 这是直接将控制台一模一样的sql查询语句放到Navica ...

  10. java 反射和泛型-反射来获取泛型信息

    通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class&l ...