抽象类和接口
抽象类
用关键字abstract修饰的类称为抽象类(abstract类)
抽象方法
使用关键字abstract修饰的方法称为抽象方法(abstract方法),抽象方法只允许声明,不允许实现
抽象类和抽象方法的关系
1.
相比于普通类,
abstract
类可以有
abstract
方法,也可以有非
abstract
方法
2.
abstract
类也可以没有
abstract
方法,这种情况下,编译器不会报错,但是
abstract
类中没有
abstract
方法是会让
abstract
类形同普通类一样,大材小用
抽象类的继承
1.
非抽象类继承了一个抽象类,则该非抽象类必须重写父类中的抽象方法
2.
抽象类继承了另一个抽象类,则该抽象类可以重写父类中的抽象方法,也可以直接继承父类中的抽象方法
3.对于抽象类,只能声明,不能使用new运算符创建该类的对象
/*
* 抽象类Water定义了两个抽象方法:process和source,一个非抽象方法getType
*/
public abstract class Water {
public int type;
public abstract String process();
public abstract void source();
public int getType() {
return type;
}
}
/*
* 抽象类SpringWater重写了Water的source抽象方法,且继承了process抽象方法
*/
public abstract class SpringWater extends Water {
@Override
public void source() {
}
}
/*
* 非抽象类YiBao,必须重写父类SpringWater中的process抽象方法
*/
public class YiBao extends SpringWater {
@Override
public String process() {
return null;
}
}
接口的诞生
Java不支持多继承性,即一个类只能有一个父类,单继承性使得Java简单,易于管理和维护。那么为了克服Java单继承的缺点,Java使用了接口,一个类可以实现多个接口
接口的定义
Java使用关键字interface来定义一个接口。跟类的定义相似,接口的定义分为接口的声明和接口体。接口体重只包含常量的声明(没有变量)和抽象方法(没有普通方法)定义两部分,且接口体中所有常量以及所有抽象方法的访问权限一定都是public(允许省略public、final、abstract修饰符)
接口的使用
类通过关键字implements声明自身实现一个或多个接口,多个接口名之间用逗号隔开。实现接口的类必须重写接口中定义的所有方法
/*
* interface Car是接口声明,花括号中的内容是接口体
*/
public interface Car {
public final float weight = 200.0f;
int height = 180;//等价于public final int height = 180;
public abstract void color();
void speed();//等价于public abstract void speed();
}
/*
* Diver类继承了Person类,并实现了Car和Tool两个接口
*/
public class Diver extends Person implements Car,Tool {
@Override
public void color() {
}
@Override
public void speed() {
}
@Override
public void repair() {
}
}
接口和抽象类的比较如下:
1.
接口和抽象类都有
abstract
方法
2.
接口中只可以有常量,不能有变量;而抽象类中既可以有常量也可以有变量
3.
接口中只有
abstract
方法;而抽象类中既有
abstract
方法也可以有普通方法(非
abstract
方法)