• 在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题。下面我来谈谈自己的理解。如有不妥之处,还望批评指正,不胜感激。

1.抽象类

我们定义一个抽象类person.class表示人:

//使用关键字abstract
public abstract class person {//吃东西的抽象方法,已经有所实现public void eat(){System.out.println("我是抽象方法吃东西");}//public 修饰的空实现的方法public void run(){}//无修饰,空实现void walk(){}//protected修饰的方法,空实现protected void sleep(){}//private修饰的空实现方法private void read(){}
}
  • 1.抽象类使用abstract修饰,可以有抽象方法,也可以完全没有抽象方法,也可以是实现了的方法,但是所有的方法必须实现,空实现(public void walk(){})也是实现的一种,~~而不能写 public void eat(),后面必须带大括号。
  • 2.方法修饰符可以使public,protected,private,或者是没有,没有默认为只能在同一个包下面继承,如果是private那么子类继承的时候就无法继承这个方法,也没有办法进行修改.
  • 下面我们来写一个Teacher.class继承抽象类

    同一个包下继承:

    不同的包下面继承:

    同个包下正确的代码如下(不重写私有的方法):

public class teacher extends person {@Overridepublic void run(){System.out.println("我是实体类的方法跑步");}@Overridevoid walk(){System.out.println("我是实体类的方法走路");}@Overrideprotected void sleep(){System.out.println("我是实体类的方法睡觉");}
}
  • 结果如下(没有覆盖抽象类吃东西的方法,所以会调用抽象类默认的):

  • 下面代码是重写了eat()方法的代码,重写是即使没有使用@Override也是起作用的:
public class teacher extends person {public void eat(){System.out.println("我是实体类的方法吃东西");}@Overridepublic void run(){System.out.println("我是实体类的方法跑步");}@Overridevoid walk(){System.out.println("我是实体类的方法走路");}@Overrideprotected void sleep(){System.out.println("我是实体类的方法睡觉");}
}
  • 结果如下,吃东西的方法被覆盖掉了:
  • 抽象类不能被实例化,比如:
  • 子类可以实现抽象类的方法,也可以不实现,也可以只实现一部分,这样跑起来都是没有问题的,不实现的话,调用是默认使用抽象类的空实现,也就是什么都没有输出,要是抽象类有实现,那么会输出抽象类默认方法。
    比如:

    <br>

  • 抽象类中可以有具体的方法以及属性(成员变量)
  • 抽象类和普通类之间有很多相同的地方,比如他们都可以都静态成员与静态代码块等等。

2.接口

  • 接口就是对方法或者动作的抽象,比如person.class想要成为教师,可以实现教师的接口,可以理解为增加能力。
  • 接口不允许定义没有初始化的属性变量,可以定义public static final int i=5;,以及public int number =0;,但不允许public int num;这样定义,所有private的变量都不允许出现,下面是图片

定义public int number =0;默认是final修饰的,所以也不能改变它的值:

下面是正确的接口代码:

  • Teacher.class
public interface Teacher {public static final int i=5;public int number =0;public void teach();void study();
}
  • 实现类TeacherClass.class
public class TeacherClass implements Teacher{@Overridepublic void teach() {System.out.println("我是一名老师,我要教书");System.out.println("接口的static int是:"+i);}@Overridepublic void study() {System.out.println("我是一名老师,我也要学习");System.out.println("接口的int number是:"+number);}
}
  • 测试类Test.class
public class Test {public static void main(String[] args){TeacherClass teacherClass = new TeacherClass();teacherClass.study();teacherClass.teach();System.out.println("-----------------------------------------------------");Teacher teacher =teacherClass;teacher.study();teacher.teach();}
}

结果:

分析:接口里面所定义的成员变量都是final的,不可变的,实现接口必须实现接口里面所有的方法,不能只实现一部分,没有使用static final修饰的,默认也是final,同时必须有初始化的值,接口不能直接创建对象,比如Teacher teacher = new Teacher() ,但是可以先创建一个接口的实现类,然后再赋值于接口对象。

3.总结:

抽象类 接口
使用关键字abstract修饰 使用关键字interface
使用关键字extends实现继承,可以只实现一部分方法,一部分不实现,或者不实现也可以 implements来实现接口,实现接口必须实现里面都有的方法
抽象类里面的方法可以是空实现,可以默认实现,但是必须要带{} 接口里面的方法都没有实现体,也就是{}
抽象类中可以有具体的方法以及属性,也可以有静态代码块,静态成员变量 接口里面不能有普通成员变量,必须都是不可变的final成员变量,而且所有的成员变量都必须是public
抽象类里面的方法可以是public,protect,private,但是private无法继承,所以没有人会这么写,如果没有修饰符,那么只能是同一个包下面的类才能继承 接口的方法只能是public或者无修饰符,所有的private修饰都是会报错的
如果有改动,添加新的方法,可以直接在抽象类中实现默认的即可,也可以在实现类中实现 接口增加新方法必须在接口中声明,然后在实现类中进行实现
抽象类不能直接创建对象 接口也不能直接创建对象 ,可以赋予实现类的对象
抽象类可以有main方法,而且我们可以直接运行,抽象类也可以有构造器 接口不能有main方法,接口不能有构造器

那么我们什么时候使用接口什么时候使用抽象类呢?

  • java有一个缺点,只能实现单继承,个人觉得接口是为了弥补单继承而设计的。
  • 接口是对本质的抽象,比如人,可以设计为person.class这个抽象类,提供相关的方法,属性,但是接口是只提供方法的,也就是像增加功能的,那么也就是对方法的抽象。
  • 如果需要默认实现,或者基本功能不断改变,那么建议使用抽象类,如果只是增加一种方法,那么建议使用接口,如果想实现多重继承,只能是接口与抽象类一起使用已达到想要实现的功能。

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

java接口与抽象类异同分析相关推荐

  1. java接口和抽象类的区别(经典面试题)

    java接口和抽象类的区别(经典面试题) 要了解接口和抽象类的区别,首先需要明白接口和抽象类的定义. 1.抽象类 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可 ...

  2. 什么时候使用接口?什么时候使用抽象?选择Java接口还是抽象类 (转)

    老帖了,但是还是想自己收录一下.最后也把自己对于这个问题的一些粗糙的理解记录下来. 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的.在这种情况下,各个对象内部是如何实现自己的对 ...

  3. java接口和抽象类的区别和作用

    java接口和抽象类的区别和作用 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过(implements)接口的方 ...

  4. 抽象类中不能有private的成员_【java基础】-- java接口和抽象类的异同分析

    在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题.下面我来谈谈自己的理解.如有不妥之处,还望批评指正,不胜感激. 1.抽象类怎么定义和继承? 2.接口怎么定义和实现? 3. ...

  5. java抽象类接口举例代码_Java接口和抽象类实例分析

    本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相 ...

  6. 没有体现JAVA接口功能_深入浅出分析Java抽象类和接口【功能,定义,用法,区别】...

    本文实例讲述了Java抽象类和接口.分享给大家供大家参考,具体如下: 对于OOP编程来说,抽象是它一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口. 这两者有相似之处也有很 ...

  7. Java接口和抽象类的异同

    1.接口 概念:接口是对行为的抽象,也可以说是对类局部(行为)的抽象. 说明:接口中可以含有变量和方法,但是,接口中的变量会被隐式地指定为public static final.而方法会被隐式地指定为 ...

  8. Java 接口和抽象类可以被new么?

    背景: 最近有同事跟我说了他面试时遇到的问题,考官问:"接口和抽象类可以被new嘛?".这可能不是考官的原话,但是据他表达考官大概就是这个意思了.听到这个问题,我的第一反应是肯定不 ...

  9. Java 接口和抽象类可以被new么?——顺便总结内部类

    转载:https://blog.csdn.net/hackersaillen/article/details/47281549 背景: 最近有同事跟我说了他面试时遇到的问题,考官问:"接口和 ...

最新文章

  1. js基础到精通全面教程--JS教程(转载)--推荐
  2. 解密PreAngel区块链布局:平台协议类项目占4成,多个项目蓄势待发
  3. 设计一个处理两种类型地址的地址簿程序_编译器设计-符号表-中间代码生成
  4. php getbyid,ThinkPHP查询中的魔术方法简述
  5. eclipse php xdebug,Eclipse for php + Xdebug搭建PHP的调试环境
  6. Web安全之跨站脚本攻击(XSS)
  7. 分治比赛选手循环问题
  8. Java JavaFX 批量修改文件夹里面的文件的名字
  9. NSURLSession学习笔记(二)Session Task
  10. TCP/IP路由技术 -1.3 IPv4地址
  11. java 反射 获取Class对象的三种方式
  12. 推荐系统(7):推荐算法之基于协同过滤推荐算法
  13. 2.Smali的基础语法
  14. 【壁纸小程序】搭建自己的壁纸小程序-微信抖音双端
  15. 点云 ICP学习-IterativeClosestPoint
  16. Python 文件IO操作
  17. vue打开外部页面_vue项目中嵌套外部网页
  18. 人工智能对客服职业的影响
  19. 安装数据库中间件——Mycat
  20. 《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别

热门文章

  1. 8421快速转换法 2、10、16进制快速转换
  2. 如何快速改变视频文件的hash值?
  3. 网页导航树的简单快速美观之实现
  4. 基于java+springboot+mybatis+vue+elementui的健身房课程预约管理系统
  5. PHP进行3des加密
  6. maya多边形建模怎样做曲面_Maya的几种建模方法
  7. 3000字英文随笔(挽救下语感)
  8. vscode markdown preview enhance 插件 pdf 导出
  9. 卷积神经网络实战之LeNet5股票预测代码实现及遇到各种问题的解决方案
  10. mqtt 串口_快速开发MQTT(一)电子工程师眼中的MQTT