一、抽象类
父类中的方法,被它的子类各自实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法 。Java语法规定,包含抽象方法的类就是抽象类。
抽象方法: 没有方法体的方法。
抽象类: 包含抽象方法的类。
注意事项:
1、抽象类不能创建对象,只能创建其非抽象子类的对象
2、抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
3、抽象类中,不一定含抽象方法,但是有抽象方法的类必定是抽象类。
4、抽象类的子类,必须重写抽象父类中所有的抽象方法,否则该子类必须声明为抽象类。
abstract class Animal{///抽象类
public abstract void eat();
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("🐶正在吠!!!");
}
}
public class test{
public static void main(String [] args){
Dog dog = new Dog();
dog.eat();
}
}
二、接口
2.1、接口的定义
接口是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK7及以前),默认方法和静态方法(JDK8),私有方法(JDK9)。
注意:接口只描述所具备的方法,并没有具体实现,具体实现由接口实现类完成。
2.2、接口的特点
· 接口的定义与类的定义相似,但接口使用关键字instanceof 代替了类中的关键字class。
· 接口必定是抽象类,因为接口中的方法都是公共访问(public)的抽象方法,不允许使用其他权限。
· 接口中,无法定义普通的成员变量,必须是常量(被必须被public static final修饰),而且是恒定不变。而接口中的成员方法(必须被public abstract修饰),是没有方法体的方法。
· 接口中,没有构造方法,没有静态代码块,不能创建对象。因为方法不可以调用。
· 接口实现类必须实现接口中的所有抽象方法,否则是实现类是一个抽象类。
2.2、为什么要用接口?
因为Java不支持多继承,只能通过实现接口来弥补这个局限。
2.3、接口的实现(关键字implements)
interface Life{
public abstract void eat();
public abstract void sleep();
public default void fly(){///默认方法
System.out.println("天上飞");
}
public static void run(){///静态方法,只能使用接口名调用,不能通过类的类名或者实现类的对象的调用
System.out.println("跑起来");
}
///接口中的私有方法的使用是JDK9的特性:
// 私有方法只有默认方法可以调用
//私有静态方法:默认方法和静态方法可以调用
}
class Animal implements Life{
public void eat(){
System.out.println("吃东西");
}
public void sleep(){
System.out.println("睡觉");
}
///接口中的默认方法,可以重写也可以不重写
///无法重写静态方法
}
public class test{
public static void main(String [] args){
Animal a = new Animal();
a.eat();
a.sleep();
a.fly();
Life.run();
}
}
2.4、接口的多实现
一个类可以实现多个接口,并且,一个类能继承一个父类,同时实现多个接口。
///格式
class 类名 [extends 父类名] implements 接口名1,接口名2,...{
///重写接口中抽象方法[必须]
///重写接口中默认方法[不重名可选]
}
接口的多实现的注意事项:
抽象方法: 如果抽象方法有重名(参数相同)时,只需要重写一次。
默认方法: 如果方法有重名,必须重写一次。
静态方法: 同名不会出现冲突,通过各自接口名访问静态方法。
优先级问题: 当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。
2.5、接口的多继承(关键字extends实现)
一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。如果父接口中的默认方法有重名,子接口需要重写一次。
2.6、接口的作用和意义
2.6.1、作用:
可以使项目分离,所有层都面向接口开发,提高开发效率。
接口是代码和代码之间的耦合度降低。变得可插拔,可以随意切换。
接口和抽象类都能完成某个功能,优先选择接口,因为接口可以多实现,多继承。并且一个类除了接口之外,还可以继承其他类。
2.6.2、意义:
定义接口的重要性: 在Java编程,abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。
定义接口有利于代码的规范: 对于一个大型项目而言,架构师往往会对一些主要的接口来进行定义,或者清理一些没有必要的接口。这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。
有利于对代码进行维护: 比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现现有的类已经不能够满足需要,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
保证代码的安全和严密: 一个好的程序一定符合高内聚低耦合的特征,那么实现低耦合,定义接口是一个很好的方法,能够让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见。
三、抽象类和接口的区别
结构组成 | 权限修饰符 | 关键字使用 | 子类限制 | 关系 | |
---|---|---|---|---|---|
抽象类 | 普通类+抽象方法 | 任何权限修饰符 | extends | 单继承,一个子类只能继承一个父类 | 抽象实现类可以实现多个接口 |
接口 | 全局变量+抽象方法 | 只能是public | implement | 一个子类可以实现多个接口 | 接口不能继承抽象类,但是一个接口可以继承多个父接口 |
四、参考资料
1、黑马程序员
2、https://baijiahao.baidu.com/s?id=1595511474536870490&wfr=spider&for=pc
3、https://blog.youkuaiyun.com/qq_19782019/article/details/80259836
4、 https://blog.youkuaiyun.com/xmfjmcwf/article/details/88856067?utm_source=app