抽象类和接口

抽象类

  1. abstract class
  2. 抽象类无法被实例化
  3. 虽然抽象类无法实例化,但是抽象类有构造方法,该构造方法是给子类创建对象用的
  4. 抽象类中可以定义抽象方法。
    抽象方法的语法:在方法的修饰符列表中添加abstract关键字,并且以“;”结束,不能带有“{}”。例如:public abstract void m1();
  5. 抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中。
  6. 一个非抽象的类继承抽象类,必须将抽象类中的抽象方法重写,实现。
  7. 抽象类无法被final修饰
例子
abstract class A{//定义一个抽象类
    public void fun(){//普通方法
        System.out.println("存在方法体的方法");
    }
    public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}

Java语言中的修饰符列表

接口

接口也是一种引用类型,可以等同看做类。

  1. 如何定义接口,语法:
    [修饰符] interface 接口名{}
  2. 接口中只能出现:常量,抽象方法
  3. 接口其实是一个特殊的抽象类,特殊在接口是完全抽象的
  4. 接口中没有构造方法,接口也无法被实例化
  5. 接口和接口之间可以多继承
  6. 一个类可以实现多个接口。(这里的”实现”可以等同看做“继承”)
  7. 一个非抽象的类实现接口,需要将接口中的所以方法“实现/重写/覆盖”
  8. 接口的作用
    a) 可以使项目分层(分为Test主类和Impl实现类两层,中间用接口连接),所有层都面向接口开发,开发效率提高了。
    b) 接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”,可以随意切换
    c) 接口和抽象类都可以完成某个功能,优先选择接口。因为接口可以多实现,多继承,并且一个类除了实现接口之外,还可以去继承其他类。(保留了类的继承)
范例:
public interface A {
    //常量:必须用public static final 修饰
    public static final String name = "zhangsan";
    public static final double PI = 3.14;

    //public static final 可以省略的
    byte MAX_VALUE =127;

    //抽象方法用public abstract修饰
    public abstract void m1();

    //可以省略public abstract
    void m2();
}
例子1:
CustomerService.java //定义接口
public interface CustomerService {
    void logout();//抽象方法
}
----------------------------
Impl.java //实现接口的类
public class Impl implements CustomerService {
    public void logout() { //重写
        System.out.println("成功退出系统");
    }
}
--------------------------
Test.java  //主类调用接口
public class Test {
    public static void main(String[] args) {
        CustomerService cs = new Impl(); //多态(左边接口,右边实现类),面向接口去调用(使用接口中声明的方法,只关心接口中声明的方法);不关心底层对象(不关心Ipml类中的logout();具体怎么实现的)
而Impl对象中的logout();方法也是依赖接口实现的。所有,两者都依赖接口
        cs.logout(); 
//编译时期静态绑定接口CustomerService中的logout();运行时期绑定接口的实现类Impl中的logout();
    }
}

图解接口1

例子2:
/*Engine.java  接口(中间层:连接甲方和乙方)
汽车和发动机之间的接口
生产汽车的厂家面向接口生产
生产发动机的厂家面向接口生产*/
public interface Engine {
    public abstract void start();
}
--------------------------------
//Honda.java 发动机Honda(乙方->实现接口)
public class Honda implements Engine {
    public void start() {
        System.out.println("Honda启动");
    }
}
----------------------
//Yamaha.java 发动机Yamaha(乙方->实现接口)
public class Yamaha implements Engine {
    public void start() {
        System.out.println("Yamaha启动");
    }
}
-------------------------
//Car.java 汽车(甲方->面向接口编程)
public class Car {
    //面向接口编程,Engine
    Engine e;

    Car(Engine e){
        this.e = e;
    }
    public void testEngine() {
        e.start(); //面向接口调用
    }
}
----------------------------
//Test.java 主类
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Yamaha y = new Yamaha(); //生产发动机
        Honda h = new Honda();
        Car c = new Car(y); //生产汽车
        c.testEngine();
        c.e = new Honda();
        c.testEngine();
    }
}
结果:
Yamaha启动
Honda启动
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值