一、抽象类
被abstract修饰的方法就是抽象方法,没有方法体,抽象方法必须存在于抽象类。
1. 特点:
- 抽象类不能实例化
- 抽象类中可以定义具体方法,还可以定义任意内容
- 抽象类的使用:通过子类使用
- 抽象方法:必须重写
- 抽象方法以但被重写就不需要再次被重写,但可以再次按需重写
- Abstract不能与private、final、native、static一起使用
2.与具体类比较
- 抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
- 允许(但不要求)抽象类包含抽象成员。
- 抽象类不能被密封。
public abstract class Employee {
private String name;
private String address;
public Employee(String name, String address) {
this.name = name;
this.address = address;
}
public abstract void output();
}
class Test extends Employee{
public Test(String name, String address) {
super(name, address);
}
@Override
public void output() {
}
}
二、接口
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
1. 接口特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
2. 接口的声明
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
注意:
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
- 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
- 接口中的方法都是公有的。
例:
public interface BuyWater {
void show(Water water);
}
3. 实现类
可以多实现
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
例:
public class BuyWaterImpl implements BuyWater {
@Override
public void show(Water water) {
System.out.println("名称:"+water.getName());
System.out.println("容量:"+water.getVolume());
}
}
4. 接口的继承
一个接口可以继承另一个接口,类似于类与类之间的继承关系
注意:
在Java中,接口可以实现多继承,但类的多继承不合法。
例:
public interface BuyWater extends BuyCoffee,BuyCola {
void show(Water water);
}
5. jdk1.8新增功能
可以在接口中定义带有方法体的方法
静态方法:根据接口名调用
默认方法:根据实现类调用