抽象类
一个类中如果存在抽象方法,那么该类就必须申明为抽象类
定义格式:
如果一个类包含抽象方法,那么该类必须是抽象类。注意:抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类。
abstract class 类名字 {
}
注意事项:
- 抽象类不能实例化
- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
- 可以有构造方法
- 抽象类的子类(1.要么重写抽象类中所有的抽象方法 2.要么是抽象类)
抽象方法
将共性的行为抽取到父类之后。由于每一个子类执行的内容是不一样的,所以,父类不能确定具体的方法体。该方法就可以定义为抽象方法
定义格式:
使用abstract
关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
修饰符 abstract 返回值类型 方法名 (参数列表);
例如:public abstract void run();
抽象类抽象方法的意义:
开发过程中,有多个人对一个项目进行开发,当两个对象有相同的行为方法的时候,很难保证统一,采用子类继承抽象类的方法可以保证子类中继承的抽象方法必须重写。抽象类存在的意义是为了被子类继承,否则抽象类将毫无意义。抽象类可以强制让子类,一定要按照规定的格式进行重写。
接口
接口是更加彻底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同样是不能创建对象的。
//接口的定义格式:
interface 接口名称{
// 抽象方法
}
// 接口的声明:interface
// 接口名称:首字母大写,满足“驼峰模式”
- 接口不能实例化
- 接口和类之间的关系,通过implements关键字表示(public class 类名 implements 接口名{})
- 接口的子类(实现类)-要么重写接口中所有的抽象方法,要么是抽象类
注意:
1.接口和类之间可以是一点一的关系,也可以是一对多的关系
例如:public class 类名 implements 接口1,接口2{}
2.实现类可以继承一个类的同时实现多个接口
例如:public class 类名extends父类 implements 接口1,接口2{}
接口中成员的特点:
1.成员变量:
只能是常量
默认修饰符:public static final
2.构造方法
接口没有构造方法
3.成员方法
只能是抽象方法
默认修饰符:public abstract
JDK7之前:接口中只能定义抽象方法
JVM内查看工具:
接口和类之间的关系:
类和类:
继承关系,只能单继承,不能多继承,可以多层继承
类和接口:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
实现多个接口时候若有同名的方法重写一次即可
接口和接口:
继承关系,可以单继承,也可以多继承
注:如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法
public class Test implements SUN{//sun extends fu、zi
@Override
public void method3() {
}//sun
@Override
public void method1() {
}//fu
@Override
public void method2() {
}//zi
}
JDK8接口新特性:
方法体:
Jdk8之前,只要接口中添加了新的方法,若调用接口的类不重写接口中新增的方法该类就会报错。
Jdk8之后,接口可以定义有方法体的方法,在对接口中添加新方法时,实现类不需要立马修改,等用到某个规则时再重写。
Jdk7之前:接口中只能定义抽象方法
Jdk8:接口中可以定义有方法体的方法(默认静态)
Jdk9:接口可以定义私有方法
Jdk8以后接口新增方法:
允许接口中定义默认方法,需使用关键字Default修饰
作用:解决接口升级问题
接口默认方法定义格式:
格式:public default 返回值类型 方法名(参数列表){}
范例:public default void show(){}
注意:
默认方法不是抽象方法,不强制重写。若要重写需去掉default关键字
public可以省略,default不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
public interface inter {
public abstract void method();
public default void show(){
System.out.println("接口 default");
}
}
静态方法:
允许在接口中定义静态方法,用static修饰
定义格式:
格式:public static 返回值类型 方法名(参数列表){}
范例:public static void show()
注意事项:
静态方法只能通过接口名调用 ,不能通过实现类名或者对象名调用
public可以省略,static不可以省略
public interface inter {
void method();
public static void show(){
System.out.println("inter static");
}
}
===========================================
public class main {
public static void main(String[] args) {
demo7 demo7 = new demo7();
demo7.method();
inter.show();
}
}
Jdk9接口新特性:
私有方法,将抽取出来的不想被别人访问的方法私有化
定义格式:
格式1:private 返回值类型 方法名(参数列表){}
格式2:private static 返回值类型 方法名(参数列表){}
public interface inter {
public default void show1(){
System.out.println("hello");
log();
}
public default void show2(){
System.out.println("hello");
log();
}
private void log(){
System.out.println("log");
}
}
- 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
- 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态
设计模式:适配器
设计模式:是一套被方法使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性、程序的重用性
简而言之:设计模式就是各种套路
适配器模式:在实现类和接口之间添加一个抽象类,抽象类(父)中重写接口中所有的方法但是没有方法体。实现类(子)继承抽象类需要使用接口中的哪个方法就重写抽象类中接口的方法
- 当一个接口中抽象方法过多,但我们只需要使用其中一部分的时候,就可以适配器设计模式
- 书写步骤:
1.编写中间类xxxAdapter,实现对应接口。
2.对接口中的抽象方法进行空实现
3.实现类继承中间类,并重写需要用的方法
4.为了避免其他类创建适配器的对象,中间的适配器类用abstract进行修饰