抽象(abstract)和接口(interface)在Java中都是关键字,也就说明他们足够重要,而抽象类和接口为我们面向对象编程提供了非常大的帮助。下面我们就一起来回顾这基础知识。
在构建某些未实现方法的类时,你可能会第一个想到接口,但是抽象类也是实现这个目的一种重要而必要的工具。
创建抽象类需要用到abstract关键字来修饰类,我们希望通过这个通用的类操作一系类方法,如果没有具体的内容,这个抽象类的意义只有一个,就是不让其他类实例化这个抽象类的对象,只能实例化它的子类对象;要达到操控,Java给我们提供了抽象方法的机制,抽象方法也是使用abstract关键字来修饰, 包含抽象方法的类就叫做抽象类
抽象类特点
抽象类成员特点:
实例
/** * @Author: mao.qitian * @Date: 2018/8/11 0011 16:25 * @Description: 汽车抽象类 */ public abstract class Car { public Car(){ System.out.println("抽象类的构造方法被调用"); } public void driver(){ System.out.println("所有汽车都能驾驶"); } //汽车的速度 public abstract void speed(); } /** * @Author: mao.qitian@gxxmt.com * @Date: 2018/8/11 0011 16:29 * @Description: 捷达 */ public class Jetta extends Car{ public Jetta(){ super(); } @Override public void speed() { System.out.println("开完兰博基尼再开捷达速度上无法适应"); } } /** * @Author: mao.qitian * @Date: 2018/8/11 0011 22:39 * @Description: 超跑 */ public abstract class SuperCar extends Car { //超跑的价格 public abstract void expensive (); } /** * @Author: mao.qitian * @Date: 2018/8/11 0011 16:27 * @Description: 兰博基尼 */ public class Lamborghini extends SuperCar { @Override public void speed() { System.out.println("兰博基尼速度两秒破百"); } @Override public void expensive() { } } 复制代码
接口使抽象的更向前迈进了一步,interface关键字修饰方法产生的是完全抽象的类,它允许创建者定义方法名,传参和返回类型,但是它没有任何方法体,只提供了形式(规则),而未提供任何具体实现。
接口的特点
接口成员特点
/** * @Author: mao.qitian * @Date: 2018/8/12 0012 0:22 * @Description: */ public interface A { public void b(); } class C implements A{ public C(){ super();//调用的是Objetc类的构造方法,方法默认继承Objetc类 } @Override public void b() { } } 复制代码
接口的应用
策略模式: 定义一系列算法,把每一个算法封装起来,并且使他们可以相互替换。策略模式使得算法可独立于使用它的客户端而独立变化 。
三个角色
实现学校教师的奖金发放,教师有属性:编号、姓名,教学总工作量,奖金 奖金的计算方法为: x*30 (当职称为教授时) y= x*25 (当职称为副教授时) x*20 (当职称为讲师时) public interface Function { //接口定义抽象方法 (Stragety) public double Money(double x); } public class A implements Function { //教授奖金计算 public double Money(double x) { return x*30; } public class B implements Function { //副教授奖金计算 public double Money(double x) { return x*25; } } public class C implements Function { //讲师奖金计算 public double Money(double x) { return x*20; } } public class myMoney { //上下文角色 Function s; double M;//工时 String name;//教师姓名 String type;//教师职称 int number;//教师编号 public void S(double X,String N,int Num,String Type){ this.M=X; this.name=N; this.number=Num; this.type=Type; } //奖金计算方式 public double getMoney(){ if(type.equals("教授")) s=new A(); if(type.equals("副教授")) s=new B(); if(type.equals("讲师")) s=new C(); return s.Money(M); } } myMoney f=new myMoney(); Scanner sc=new Scanner(System.in); System.out.println("请输入职位:"); String Type=sc.next(); System.out.println("请输入姓名:"); String N=sc.next(); System.out.println("请输入编号:"); int Num=sc.nextInt(); System.out.println("请输入工时:"); double X=sc.nextDouble(); f.S(X, N, Num, Type); System.out.println(N+奖金为"+f.getMoney()); 复制代码
类与类,类与接口,接口与接口之间的关系
/** * @Author: mao.qitian * @Date: 2018/8/12 0012 0:22 * @Description: */ public interface A { public void a(); } interface B { public void b(); } interface C extends B,A{ //接口与接口之间继承,多继承 public void c(); } class D implements A,B,C{ @Override public void a() { } @Override public void b() { } @Override public void c() { } } 复制代码
类 | 成员区别 | 继承关系区别 | 设计理念区别 |
---|---|---|---|
抽象类 | 成员变量可以是常量,也可以是变量,有构造方法,成员方法可以是抽象的也可以是非抽象的 | 单继承,多层继承 | 被继承的体现是“is a”的关系,抽象类中定义的是该继承体系的共性功能 |
接口 | 成员变量只能是常量,没有构造方法,成员方法只能是抽象的 | 实现,可以实现多个接口 | 被继承的体现是“like a”的关系,接口中定义的是该继承体现的扩展功能 |
最后
还是那句话,好记性不如烂笔头,通过这一篇文章,再次巩固了基础知识。如果文章中有写得不对的地方,请给我留言指出,大家一起学习进步。
参考资料: