前言
以前就知道抽象类是事物的抽象 ,接口是行为的抽象, 大白话就是,抽象类:我是什么?接口:我能做什么?最近看到抽象类思考为什么抽象类有构造函数而接口不需要构造函数,从而引出下文思考。
代码对比
我们先看看代码对比:
typescript
public abstract class AbstractPerson {
private String name;
private int age;
public AbstractPerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public abstract String getSelfIntroduce();
private String getDescription(){
return "I am a " + this.name + " " + this.age + " years old";
}
}
public class Employee extends AbstractPerson{
public Employee(String name, int age) {
super(name, age);
}
@Override
public String getSelfIntroduce() {
return "我是员工";
}
}
public class Student extends AbstractPerson{
public Student(String name, int age) {
super(name, age);
}
@Override
public String getSelfIntroduce() {
return "我是一个学生";
}
}
csharp
public interface InterfacePerson {
//接口中无法定义无含义变量
// public String name;
int age=10;
public default String sayHello() {
return "Hello,我是**,我"+age+"岁了!";
}
public abstract void hug();
}
public class Boss implements InterfacePerson{
@Override
public void hug() {
System.out.println("Boss hug me");
}
}
csharp
public class Main {
public static void main(String[] args) {
//抽象类
AbstractPerson a=new Student("小明",18);
AbstractPerson b=new Employee("大红",41);
System.out.println(a.getName());
System.out.println(a.getSelfIntroduce());
System.out.println(b.getName());
System.out.println(b.getSelfIntroduce());
//接口
InterfacePerson c=new Boss();
System.out.println(c.sayHello());
c.hug();
}
}
区别
可能代码繁杂,但是你按照这几个方向去对比即可
1. 两者方法上的区别
抽象父类中,测试的方法有构造方法,抽象方法(必须public被继承),普通方法。
接口中,测试的方法有public default方法,public abstract方法,由于接口就是用来实现的所以他们的public可以省略,且我们使用接口其实默认省略了public。
他们都有代码复用的方法,抽象类的getName方法,接口的default修饰的sayHello方法,其实他们两者的区别就是抽象类比接口多了构造函数, 为什么这么说,因为抽象类可以通过子类的构造函数利用supper给父类的变量赋值(也可以不赋值跟接口的复用函数作用一样)
2. 两者变量上的区别
变量上的区别比较简单,抽象类可以选择赋值或者不赋值,接口只能有被赋值的变量
总结
两者都可以代码复用,都可以继承/实现继承类/实现类的方法,由于有构造函数,抽象类的代码复用更加灵活,还有一些就是类与接口的区别,比如类单继承,接口多实现,抽象类的变量赋值比接口更灵活。