抽象类和接口

来源:互联网 发布:简单软件的c语言程序 编辑:程序博客网 时间:2024/05/17 22:39

抽象类

  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启动
原创粉丝点击