抽象(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”的关系,接口中定义的是该继承体现的扩展功能 |
最后
还是那句话,好记性不如烂笔头,通过这一篇文章,再次巩固了基础知识。如果文章中有写得不对的地方,请给我留言指出,大家一起学习进步。
参考资料: