十七、抽象
概述
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
没有方法体:public void eat(){}
里面是空的,所以是没有方法体。
特点
-
抽象类和抽象方法必须使用abstract关键字进行修饰
public abstract class 类名{}
public abstract void eat();
-
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
-
抽象类不能实例化
例如animal是一个抽象类,则animal a = new animal()就不能使用
-
抽象类的子类
要么重写抽象类的所有抽象方法
要么是抽象类
-
成员变量可以是变量也可以是常量
-
有构造方法但不能被实例化,用于子类访问父类数据的初始化
-
成员方法
可以有抽象方法,限定子类必须完成某些操作
也可以有非抽象方法,提高代码复用性
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,没有意义。
十八、接口
1 概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用
Java中的接口更多体现在对行为的抽象
2 接口特点
-
接口用关键字interface修饰
public interface 接口名{}
-
类实现接口用implements表示
public class 类名 implements 接口名 {}
-
接口不能直接实例化,参照多态的方式实例化,叫做接口多态
例如接口为jump,有个对象implements了jump
在测试类中定义为 jump h = new horse();
3 接口的成员特点
- 成员变量
只能是常量
默认修饰符: public static final
所以说
int num3 = 10;
public static final int num3 = 10;
//以上两句话意义相同
- 构造方法
接口没有构造方法,因为接口是对行为进行具体抽象的,没有具体存在
类Object是类层次结构的根。每个类都有Object作为超类。
没有继承的类默认继承Object,有说明继承什么对象则间接继承Object。
public class InterImpl implements Inter{}
//等价于
public class InterImpl extends Object implements Inter{}
- 成员方法
只能是抽象方法
默认修饰符: public abstract
public abstract int num = 3;
//等价于
int num = 3;
4 类和接口的关系
- 类和类的关系
继承关系,只能单继承,但是可以多层继承
- 类与接口的关系
实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口
public class InterImpl extends Object implements Inter1,Inter2,Inter3{
}
- 接口与接口的关系
继承关系,可以单继承,也可以多继承
5 抽象类和接口的区别
抽象类是对事物的抽象,而接口是对行为的抽象
-
成员区别
抽象类 变量,常量;有构造方法;有抽象方法,也有非抽象方法
接口 常量;抽象方法
-
关系去写
类与类 继承,单继承
类与接口 实现,可以单实现,也可以多实现
接口与接口 继承,单继承,多继承
-
设计理念区别
抽象类 对类抽象,包括属性、行为
接口 对行为抽象,主要是行为
Alarm.java
public interface Alarm{
void alarm();
}
Door.java
public class Door{
public void open(){...};
public void close(){...};
}
DoorDemo.java
public class DoorDemo extends Door implements Alarm{
public void alarm(){...};
}
6 接口名作为形参和返回值
方法的形参是接口名,其实需要的是该接口的实现类对象
方法的返回值是接口名,其实返回的是该接口的实现类对象
7 接口中的默认方法
当接口想要增加新的方法,但为了避免麻烦使得所有实现该接口的类都需要重写该方法
所以引入了默认方法
定义格式:
public default 返回值类型 方法名(参数){}
//范例
public default void show3(){ }
如以上例子中show3方法可以不用被重写
默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉default关键字
public可以省略,default不能省略
8 接口中的静态方法
为了防止一个类实现的多个接口中存在相似名的方法,引入了接口静态方法
定义格式:
public static 返回值类型 方法名(参数){}
//范例
public static void show()
如果是接口存在静态方法,则在main里直接调用即可
inter1.java
public interface inter1{
public static void show(){
System.out.println("show");
}
}
Demo.java
public class Demo{
public static void main(String[] args) {
inter1.show();
}
}
注意事项:
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
public可以省略,static不能省略
9 接口中的私有方法
当接口里的方法体中存在共同内容,为了避免重复的冗余代码出现,可以把这段重复性高的代码单独写成private方法出来。
接口中私有方法定义格式
private 返回值类型 方法名(参数){}
或者是带静态的
private static 返回值类型 方法名(参数){}
注意事项
默认方法可以调用静态和非静态的私有方法
静态方法只能调用私有静态方法