实例分析Java接口和抽象类的区别 java抽象类与接口的区别

前言同事问我:啥是对象?
我说:对象就是我女朋友,我女朋友就是我对象!
哈哈哈,调皮了,所谓的对象其实就是通过java类所产生的实体 。
例如:你和女朋友谈恋爱是一个java类,那么谈恋爱过程中的两个人,也就是你和女朋友都是这个java类的对象 。
同事:“这不还是对象就是我女朋友么” 。
懵逼的我:“得得得,你女朋友就是你对象,可以了吧!”
知识点,要考在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 。
接口,在JAVA编程语言中是一个抽象类型,是抽象方法的集合,一个类通过继承接口的方式,从而来继承接口的抽象方法 。
接口

  • 接口不能被实例化
  • 接口中没有构造方法
  • 使用 implements 继承接口,支持多继承
  • 实现某个接口的类必须在类中实现该接口的全部方法
  • 接口中的变量必须是 public static final 类型的(常量)
// 此变量默认为public static final的int count = 520;public static final int num = 1314;
  • 接口内的方法都是抽象的(不用abstrcat声明,默认就是抽象的)
  • 接口中的抽象方法默认为 public abstract
// 抽象方法,默认为public abstractpublic abstract void move();abstract void move1();public void move2();void move3();
  • 接口中不能含有静态代码块和静态方法(JDK 1.8 以后,接口里可以有静态方法和方法体)
  • 所以接口中的方法体类型可以为default 和 static(默认都是public的)
default void run() { }static void runs() { }
实例分析Java接口和抽象类的区别 java抽象类与接口的区别

文章插图
PS: 接口设计的目的:对类的行为进行约束,一种行为规范


抽象类
  • 不能被实例化
  • 使用extends继承抽象类,支持单继承
  • 抽象类中的变量和普通类中的变量一样
  • 抽象类可以有静态代码块和静态方法
  • 如果类中有抽象方法,则必须为抽象类
  • 抽象类中可以有非抽象方法
  • 抽象方法的类型
public abstract void head();abstract void foot();
  • 非抽象方法的类型
public void hand() { }protected void ear(){ }void eye() { }
【实例分析Java接口和抽象类的区别 java抽象类与接口的区别】PS:抽象类设计的目的:类的模板,为了代码复用
实例分析创建一个接口
// 默认为abstractpublic interface Behavior {// 此变量默认为public static final的int count = 520;// 抽象方法,默认为public abstractvoid move();// 非抽象方法default void run() {System.out.println("run");}}
此接口定义了一个抽象方法 move() 和一个非抽象方法 run()
我们要记住,接口的目的是为了对类的行为进行约束,所以以后我们继承这些行为并重写接口里面的功能时,就只能用move和run这个名字,每个人的命名方式都是不同的,所以我们使用接口对代码进行了约束
创建一个抽象类
public abstract class Animal {// 变量与普通类中的变量一样String name = "robot";Animal() {// 构造方法System.out.println("抽象类构造方法");}// 抽象方法public abstract void head();// 非抽象方法public void body() {System.out.println("body " + name);}}
此抽象类定义了一个变量、构造方法、一个抽象方法 head 和一个非抽象方法 body
在非抽象方法body中实现一些功能,这样以后我们定义类的时候,就不用每次都再去定义一些相同的功能了,只需继承这个抽象类即可,所以说设计抽象类的目的就是为了代码复用,省去了很多重复的代码
在具体的类中实现
public class Cat extends Animal implements Behavior{@Overridepublic void head() {// 重写抽象类的抽象方法System.out.println("Override head");}@Overridepublic void body() {// 重写抽象类的非抽象方法super.body();System.out.println("Override body");}@Overridepublic void move() {// 重写接口的抽象方法System.out.println("Override move " + count);}@Overridepublic void run() {// 重写接口中的非抽象方法System.out.println("Override run " + count);}public static void main(String[] args) {Cat cat = new Cat();cat.head();cat.body();cat.move();cat.run();}}
输出结果如下
实例分析Java接口和抽象类的区别 java抽象类与接口的区别

文章插图
此实现类继承了 Animal 抽象类和 Behavior 接口,并重写了它们的方法
根据以上结果可以看到