抽象类
1、什么是抽象类?
类与类之间具有共同特征,将这些特征提取出来,形成的就是抽象类。
2、抽象类属于什么类型?
抽象类也属于引用数据类型
3、抽象类的定义
[ 修饰符列表 ] abstract class 类名{
类体
}
4、什么是抽象方法?
抽象方法表示没有实现的方法,没有方法体的方法。
public abstract void doSome(); // 抽象方法
特点:以分号结尾,没有方法体,带abstract关键字修饰方法。
5、特性
(1) 抽象类无非实例化,无法创建对象,是用来被子类继承的,抽象类有构造方法,为子类提供。
(2) final与abstract关键字不能联合使用,两个关键字之间是对立关系。
(3) 抽象类的子类可以是抽象类,也可以是非抽象类。
(4) 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法供子类使用。
(5) 抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。
(6) 非抽象类继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。
接口
1、基本概述
1、接口也是一种引用数据类型。
2、接口是完全抽象的(特殊的抽象类)
3、接口定义:
[修饰符列表] interface 接口名{}
4、编译之后也是class文件。
5、接口支持多继承。
6、接口中只包含两部分:常量和抽象方法,并且所有的元素都是public修饰的(都是公开的)。
// 以下正确写法
interface Math{
// 常量 PI pi 都不能被再次修改
public static final double PI = 3.14;
// 省略 public static final 写法 接口中的变量编译器默认会改为常量
double pi = 3.1415926;
public abstract int sum(int a,int b);
// 接口中都是抽象方法,public abstract 可以省略不写,因为都是抽象方法,所以不能有方法体
int add(int a,int b);
}
2、基础语法
1、类和类之间叫做继承,类和接口之间叫做实现,也可以把实现理解为"继承",使用implments关键字来实现。
2、一个非抽象的类实现接口,必须将接口中的所有抽象方法全部实现(覆盖/重写)。
3、一个类同时可以实现多个接口,弥补了java中类与类的单继承。
4、java的接口还有个骚操作,接口之间没有继承关系,也能进行强制转换,编译不会报错。
5、extedns和implements可以共存,extends在前,implements在后。
6、使用接口时,可以使用多态(父类型引用指向子类型对象)。
interface MyMath{
double PI = 3.14;
int sum(int a, int b);
}
// 非抽象类实现接口 错误:MyMathImpl 不是抽象类,未覆盖MyMath中的抽象方法sum(int,int)
class MyMathImpl implements MyMath{
}
// 正确写法 1
abstract class MyMathImpl implements MyMath{
}
// 正确写法 2
class MyMathImpl implements MyMath{
public int sum(int a ,int b){
return a + b;
}
}
3、接口的作用(解耦合)
接口是抽象的。
菜单是一个接口。(菜单上有一个抽象的照片:西红柿炒鸡蛋)
谁面向接口调用。(顾客面向菜单点菜,调用接口。)
谁负责实现这个接口。(后台的厨师负责把西红柿鸡蛋做好!是接口的实现者。) 这个接口有什么用呢?
这个饭馆的“菜单”,让“顾客”和“后厨”解耦合了。
顾客不用找后厨,后厨不用找顾客。他们之间完全依靠这个抽象的菜单沟通。
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)
接口可以解耦合,解开的是谁和谁的耦合!!!
任何一个接口都有调用者和实现者。
接口可以将调用者和实现者解耦合。
调用者面向接口调用。
实现者面向接口编写实现。一般都是将项目分离成一个模块一个模块的,模块和模块之间采用接口衔接。降低耦合度。
抽象类和接口有什么区别?
抽象类是半抽象的。
接口是完全抽象的。
抽象类中有构造方法。
接口中没有构造方法。
接口和接口之间支持多继承。
类和类之间只能单继承。
一个类可以同时实现多个接口。
一个抽象类只能继承一个类(单继承)。
接口中只允许出现常量和抽象方法。