抽象类和接口
抽象类
- abstract修饰符可以用过来修饰方法也可以修饰类,如果修饰方法则该方法为抽象方法;如果修饰类则该类为抽象类。
- 抽象类中可以有普通方法,但是有抽象方法的类一定要声明为抽象类。
- 抽象类不能用new关键字创建对象,它是用来让子类继承的。
- 抽象方法只有方法的声明而没有方法的实现,它是让子类去实现的。
- 子类继承抽象类,必须要实现抽象类没有实现的所有抽象方法,否则该子类也要声明为抽象类。
- 抽象类存在的意义:提高开发效率
下面来看一个抽象类的实例:
abstract class AbstractClass {//abstract抽象类
//抽象方法只有方法名字没有方法的实现,连方法体都没有!
public abstract void doSomething();
}
class AbstractSon1 extends AbstractClass{
//对于抽象类的所有方法,继承了它的子类都必须要实现它的方法,除非该子类也是个抽象类
@Override
public void doSomething() {
System.out.println( "AbstractSon1实现了父抽象类的方法");
}
}
//该子类也是个抽象类就不用实现其抽象父类的方法
abstract class AbstractSon2 extends AbstractClass {
}
/**
* @ClassName Application
* @Description TODO
* @Author ${17368877923}
**/
public class Application{
public static void main(String[] args) {
new AbstractSon1().doSomething();
}
}
输出结果:
AbstractSon1实现了父抽象类的方法
接口
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范!自己无法写方法 把约束和实现分离:面向接口编程~
- 声明类的关键字是
class
,声明接口的关键字是interface
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是。。则必须能。。”的思想。
- 接口的本质是契约,制定好大家都遵守。
- Object Oriented的精髓是对对象的抽象,最能体现这一点的就是interface. 为什么我们讨论设计模式都只针对具备了抽象能力的语言(c++、java等)去讨论,就是因为设计模式所研究的实际上就是如何合理地去抽象。
下面来看接口多继承的实例:
/**
* @author 15065170282
*/
public interface UserService {
//Interface体现了抽象的思维 ~java
//interface都需要有一个实现类
//接口中定义的常量前面都默认有public static final修饰符
int AGE = 99;//常量全大写
void add();
void delete();
void update();
void query();
}
interface TimeService {
void timer();
}
//实现类末尾用Impl结尾
//接口实现了多继承
class ServiceImpl implements UserService,TimeService{//类ServiceImpl继承了两个接口
public static void main(String[] args) {
//UserService接口中的方法
new ServiceImpl().add();
new ServiceImpl().delete();
new ServiceImpl().update();
new ServiceImpl().query();
//TimeService接口中的方法
new ServiceImpl().timer();
}
@Override
public void add() {
System.out.println("UserService接口中的add方法执行");
}
@Override
public void delete() {
System.out.println("UserService接口中的delete方法执行");
}
@Override
public void update() {
System.out.println("UserService接口中的update方法执行");
}
@Override
public void query() {
System.out.println("UserService接口中的query方法执行");
}
@Override//TimeService接口中的方法
public void timer() {
System.out.println("TimeService接口中的timer方法执行");
}
}
输出结果:
UserService接口中的add方法执行
UserService接口中的delete方法执行
UserService接口中的update方法执行
UserService接口中的query方法执行
TimeService接口中的timer方法执行
接口小结
- 接口是一种约束,规定了一些规则让实现编程人员遵守;
- 接口定义的方法前默认加了
public abstract
关键字; - 接口定义的属性(常量)前默认加了
static final
关键字,常量名字母全大写; - 接口不能被实例化
- 接口中没有构造方法
- 每个接口必须有对应的实现类,实现类用
implements
关键字来实现接口,该实现类可以实现多个接口 - 接口实现类的类名结尾为
Impl
,且实现类中必须要重写接口中的所有方法