面试题之Java中接口和抽象类的区别

前言

区别两种事物就得先搞清楚它到底是什么,分别有什么作用

抽象类

拿宠物pet 和 狗dog、 猫cat 举例,pet可以定义为抽象类,因为狗和猫都有共同特性,会吃,会跑,会…做一些都会做的事。那么我们可以抽象pet,让狗和猫去继承,这样就少写很多多余的代码

//这是一个简单的抽象类 pet
public abstract class Pet {
    private String name;
    private int health;
    private int age;
    public abstract void introduce();//抽象方法
public class Dog extends Pet {
    public Dog(){}//无参构造方法
    private String strain;//dog类自己的属性
    public void introduce(){//抽象方法必须实现
            System.out.println("hello"+this.getName());
    }
}
public class Penguin extends Pet{
	private  String name;//
    public void introduce(){//抽象方法必须实现
        System.out.println(00);
    };
}

这个例子给我们的信息有哪几点:

  1. 抽象类的属性被子类继承后,子类继承了父类的属性和方法,只要在非抽象子类中(.属性)就可以得到父类属性。
  2. 父类有抽象方法时,子类必须实现父类的抽象方法有抽象方法的类一定是抽象类而抽象方法也只是个声明,没有具体的方法实现,就是告诉你、我这个抽象方法你必须去实现一下。
  3. 抽象类不能被实例化!!否则error找上门,只有抽象类的非抽象子类可以创建对象。
  4. 构造方法和static修饰的方法是不能声明为抽象方法的。

接口

使用接口也是框架dao,service常常用到的。一般用于定义方法,控制层去调用。

一个很简单的例子:

public interface ITeacherDao {
    List<Teacher> selectAll();//方法一
    int save(Teacher teacher);//方法二
}

对于接口有很多问题可以探究----------
比如接口中的常量,方法,变量等等
接口的作用:

  1. 用于描述系统对外提供的所有服务,由此可知,接口中的成员常量和方法都必须是public的,这样外部使用时就可以访问到。
  2. 因为接口只能描述系统可以实现什么方法,但是没有具体实现的方法体,这句话是不是和上面的抽象类的方法有些类似之处,因为接口中的方法都是抽象方法。方法默认是public abstract 的,所以实现了接口必须重写接口的方法的用法。
  3. 因为接口中的变量是共有的,这样的话,变量当然不能被改变,不然共有的不就变来变去,容易造成程序错误。所以变量是final的,也就是常量的概念了。

重点来了,面试官经常会问接口可不可以定义变量
一般来说,我们在接口中定义一个静态变量,因为静态变量可以直接通过类名获得,改变它后,其他实现接口的类访问时跟着会改变。这样的话,和抽象类没啥区别了,因为我们接口是提供的统一抽象的概念,所以不能出现变量,接口中有也只能是常量。
接口只是对一个事物的属性和行为更高层次的抽象。也是对开闭原则的一种体现

注:开闭原则是指以一个软件实体,如类,模块和函数应该对扩展开放,对修改关闭。就是说一个软件实体应该通过扩展来变化,而不是通过修改代码去变化。

总结:抽象类和接口的区别及细节

  1. 抽象类继承Object ,接口不继承Object
  2. 抽象类有构造器 ,接口没有构造器
  3. 抽象类有普通成员变量和常量,接口不能定义变量,只能有常量,而且只能是public static final的(默认)还必须要赋初值。
  4. 抽象类可以有抽象方法和普通的方法,接口只能有抽象的方法并且修饰符只能是public abstract (默认)
  5. 抽象类可以有final的方法,接口不能。
  6. 抽象类只能是单继承,多实现。接口可以多继承其他接口,但是不能实现接口,不能继承其他类
  7. 抽象类可以有静态方法,接口不可以。

注意:final和abstract不能同时出现。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值