抽象类-接口-实现

2021-11-24  本文已影响0人  Raral

抽象类

分析事物时, 发现了共性的内容,就出现向上抽取,但是如果父类 的方法功能与子类不同,那么这时就不抽取方法主体,这样抽取出来的方法 就是抽象方法

例子:

抽象类父类

public abstract class Parent {

    public Parent() {
        System.out.println("parent 构造函数");
    }

    //抽象方法
    public abstract void walk();

    //普通方法
    public void speck() {
        System.out.println("speck");
    }

}

子类

public class Child extends Parent {

    public Child() {
        System.out.println("child 构造函数");
    }

    @Override
    public void walk() {
        System.out.println("child 的walk方法");
    }

    public void study() {
        System.out.println("study");
    }
}

测试:

public class Test {
    public static void main(String[] args) {
//        Parent parent = new Parent();//编译错误
        Child child = new Child();
        child.speck();
        child.study();
        child.walk();
    }
}

注意事项

  1. 抽象类不能创建对象,如果创建了,编译无法通过而报错,只能创建其非抽象子类的对象

  2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的

  3. 抽象类中.不一定包含抽象方法,但是有抽象方法一定要是抽象类

  4. 抽象类的子类,必须重写抽象父类中所有抽象方法,否则,编译无法通过而报 错, 除非该子类也是抽象类

接口实现类


//这是一个接口
public interface Parent {
    public void eat();
}



//实现类
public class ParentImpl implements Parent {

    //实现接口的方法
    @Override
    public void eat() {
        System.out.println("实现类 eat");
    }
    //实现类自己的方法
    public void sleep() {
        System.out.println("实现类 自己的");
    }
}



public class Test {
    public static void main(String[] args) {
//        Parent parent = new Parent();//编译错误
        ParentImpl parent = new ParentImpl();
        parent.eat();
        parent.sleep();
    }
}

使用总结:

  1. 实现类必须实现接口的所有方法,但是实现类可以有接口没有的方法(方法数量:实现类>接口)
  2. 实现类的方法修饰符的权限必须大于接口的方法修饰符,也就是实现类的方法的可见性>接口的方法的可见性。
  3. 实现类可以有自己的属性,比如smallXeon有num,name属性。
  4. 为什么使用接口,最大目的也应该是代码重用吧,对于业务逻辑一样的类(内部实现不一样),可以直接定义接口,然后不同的业务使用不同的实现类就好了

抽象类-接口-实现类

抽象类:实现抽象层的业务方法。一般是诸如生命周期,业务流程之类的,尽量不涉及到具体实现。

接口:定义如何使用。包括外部程序如何调用,以及自己的内部程序之间如何调用。

实现类:关注于具体问题实现。

例子:退款流程需要兼容到一手退款流程

//退款类(原始类:最底层的方法逻辑)
public class Refund {
    public void refund() {
        System.out.println("原始的退款--");
    }
}
//一手退款接口(目标接口:最期待的方法)
public interface IFirstRefund {
    //最期待的方法
    public void firstRefund();
}
//适配类(兼容到 一手退款的):继承了原始类,又实现了目标接口的方法
public class Adapter extends Refund implements IFirstRefund {

    //目标接口要求调用firstRefund()这个方法名,但源类Refund没有方法firstRefund()
    //因此适配器补充上这个方法名
    //但实际上firstRefund()只是调用源类Refund的 refund()方法的内容
    //所以适配器只是将 refund()方法作了一层封装,封装成Target可以调用的firstRefund()而已
    @Override
    public void firstRefund() {
        System.out.println("自己一手退款逻辑--");
        //自己的指定业务逻辑
        //----------

        this.refund();
    }
}

public class Test {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.firstRefund();
    }
}
上一篇下一篇

猜你喜欢

热点阅读