文章目录
前言:
还在学习的过程中
水平有限,不足之处望请斧正。
1、抽象
1.1、抽象方法和抽象类的概念
-
抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。我们把没有方法体的方法称为抽象方法
- 抽象方法没有方法体,只有方法名,必须用abstract修饰。
-
抽象类: 如果一个类中存在抽象方法,那么该类就必须声明为抽象类
1.2、定义格式
抽象方法:
修饰符 abstract 返回值类型 方法名 (参数列表);
public abstract void eat() ;
抽象类:
abstract class 类名{
}
public abstract class Person{
public void eat (){
System.out.println("吃东西") ;
}
}
注意:抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类
1.3、抽象类和抽象方法的注意事项
- 抽象类不能被实例化
- 抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类
- 抽象类可以有构造方法 (当创建子类对象时,可以给子类对象进行赋值)
- 抽象类的子类
- 要么重写抽象类中的所有抽象方法
- 要么为抽象类
2、接口
2.1、接口概念
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。简单的说,接口就是一种被规范的标准,只要符合这个标准都可以通用
2.2、接口的定义和使用
- 接口使用关键字 interface 来定义
public interface 接口名{
}
- 接口不能实例化
- 接口和类之间是实现关系,通过 implements 实现
public class 类名 implements 接口名 {
}
-
接口的子类 (也称实现类)
- 要么重写接口中所有抽象方法
- 要么是抽象类
-
接口和类可以是单实现也可以是多实现
public class 类名 implements 接口1 , 接口2 ... {
}
- 实现类在继承一个类的同时还可以实现多个接口
public class 类名 extends 类名 implements 接口1 , 接口2 ...{
}
2.3、接口中成员的特点
-
成员变量
- 只能是常量
- 默认修饰符 : public static final
-
构造方法:无
-
成员方法
- 只能是抽象类
- 默认修饰符: public abstract
- 注:JDK7 以前接口中只能定义抽象方法,JDK8 可以定义有方法体的方法(默认,静态),JDK9 接口中可以定义私有方法(普通,静态)
1、JDK8 以后允许在接口中定义默认方法,需要使用关键字default修饰
定义格式:
public default 返回值类型 方法名 (参数列表){}
public default void show(){}
注意事项:
- 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
- public可以省略,default不能省略
- 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
2、JDK8 以后允许在接口中定义定义静态方法,需要用static修饰
定义格式:
public static 返回值类型 方法名 (参数列表){}
public static void show(){}
注意事项:
- 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
- public可以省略,static不能省略
3、JDK9 新增的方法,接口中可以定义私有方法
接口中私有方法的定义格式:
格式一:
private 返回值类型 方法名(参数列表){ } //没有default
private vpid show() { }
格式二:
private static 返回值类型 方法名(参数列表){}
private static void method() { }
2.4、继承和实现
类与接口是实现关系
接口与接口是继承关系
类与类是继承关系
- 类和类的关系
- 继承关系,只能单继承,不能多继承,但是可以多层继承
- 类和接口的关系
- 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
- 接口和接口的关系
- 继承关系,可以单继承,也可以多继承
- 如果类实现的接口,还继承了其它接口,那么就需要重写所有的抽象方法
2.5、适配器模式
- 一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
- 适配器设计模式:解决接口与接口实现类之间的矛盾问题,当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
- 书写步骤:
编写中间类XXXAdapter实现对应的接口
对接口中的抽象方法进行空实现
让真正的实现类继承中间类,并重写需要用的方法
为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰
代码示例:
public interface Inter {
public abstract void method1();
public abstract void method2();
public abstract void method3();
}
//适配器,中间类
public abstract class AdaperInter implements Inter{
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
public class TestAdapter extends AdaperInter{
@Override
public void method1() {
super.method1();
}
}
3、接口和抽象的区别
参数 | 抽象类 | 接口 |
---|---|---|
构造方法 | 有构造方法,可以用于子类实例化 | 没有构造方法 |
成员变量 | 可以是变量也可以是常量 | 只能是常量,默认 public static final |
成员方法 | 可以是抽象的也可以是非抽象的 | jdk 8之前只能是抽象的 |
选择依据
- 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
- 如果想实现多继承,那么请使用接口,由于java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口,因此可以使用接口来解决。
- 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类
今天的分享就到这里了,期待与你共同进步!
如有不足欢迎留言指正 !