前言
面向对象有三个特征------封装、继承、多态,以及介绍方法的重载和重写,这些都是开发中很常用的特征,基本都尊重面向对象思想。了解到了继承的时候,子类要重新写父类的方法,才能遵循子类的规则,那么忘记重写怎么办呢?所以本讲,我们讲解Java的抽象类和接口,这个跟继承有点类似,但是实现的子类必须实现对应的方法。
一、两个重要关键字
在讲解Java的抽象类和接口之前,我们必须先了解两个重要的关键字:static 和 final,这两个在接口中是很重要。static我们在第一讲helloworld就认识了,java的主方法就用了static。
1.静态static关键字
使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类
特点:
- 随着类的加载而加载,类变量,直接可以用"类.变量"调用
- 修饰的成员,被所有对象所共享,全局可访问
- 静态方法只能调用静态变量(方法)
2.不可变final关键字
使用范围:在Java类中,可用final修饰属性、方法、类,主要用于定义一些常量,不需要改变值,可以理解为,一处定义,其他地方只能引用,不能在修改了
- final标记的类不能被继承。提高安全性,提高程序的可读性。
- String类、System类、StringBuffer类
- final标记的方法不能被子类重写。
- 比如:Object类中的getClass()
- final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。
- final标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋值,然后才能使用。 final double MY_PI = 3.14;
二、抽象类和抽象方法
1.为什么要用抽象
当程序越来越大的时候,我们的类就会越来越多,父类子类关系也来越多,继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征,这也是为了程序达到"高内聚,低耦合"的特点。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。简单点,用 abstract 修饰的类/方法,就说抽象类/方法。
比如抽象类人,可以说话,具体说什么话有具体人具体:
2.抽象类的特点
抽象类其实跟普通类区别不大,普通类有的,抽象类也有,而抽象可以拥有抽象方法。抽象类/方法有以下特点:
- 抽象方法:只有方法的声明,没有方法的实现。以分号结束
- public abstract void talk();
- 含有抽象方法的类必须被声明为抽象类
- 抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体
三、接口
1.为什么要用接口
前面讲解面向对象特征的时候,我们说过继承,子类只能有一个父类,那么如果子类又要继承其他类的方法怎么办呢?又或者有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。这时候就有接口这种规范出来了,继承是一个"是不是"的关系,而接口实现则是 "能不能" 的关系。
比如:子弹可以飞又可以公交,就需要去实现可以飞,攻击型的接口
接口定义:
kotlin
不用class定义,用**interface**定义
javascript
public interface InterfaceDemo {
}
接口特点:
- 用interface来定义。
- 接口中的所有成员变量静态不可变,都默认是由public static final修饰的。
- 接口中的所有方法抽象的,都默认是由public abstract修饰的。
- jdk8,可以写default和static修饰的具体方法
javascript
public interface InterfaceDemo {
public static final int a = 10;
// 定义抽象方法
public abstract void fly();
default void eat(){
System.out.println("jdk8 default 方法");
}
static void wc(){
System.out.println("jdk8 static 方法");
}
}
接口实现:
实现类使用关键字 implements ,而且必须实现接口的抽象方法
javascript
public class InterfaceImplDemo implements InterfaceDemo{
@Override
public void fly() {
}
}
2.抽象类和接口的区别
抽象类 :与普通类的区别是加了一个abstract修饰,可以包含抽象方法,子类继承extend
接口 :没有构造方法,给子类实现,子类实现implements
成员变量只能是常量,默认修饰符:public static final
成员方法,jdk7只能用抽象,默认修饰符:public abstract;jdk8,可以写default和static修饰的具体方法
两者选择:
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话......),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把"吃东西"定义成一个接口,然后让这些类去实现它。当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
总结
本文主要是讲解Java的接口和抽象类,并且分析抽象类和接口的区别,为什么需要接口。主要是为了是程序能够"高内聚,低耦合",公共的属性统一起来,通过定义接口或者抽象类形成一种规范。接口也是后续项目开发日常编写的工作,基本会把每个功能点,编写对应的接口,提供给前端调用。