抽象类
分析事物时, 发现了共性的内容,就出现向上抽取,但是如果父类 的方法功能与子类不同,那么这时就不抽取方法主体,这样抽取出来的方法 就是抽象方法
例子:
抽象类父类
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();
}
}
注意事项
-
抽象类不能创建对象,如果创建了,编译无法通过而报错,只能创建其非抽象子类的对象
-
抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的
-
抽象类中.不一定包含抽象方法,但是有抽象方法一定要是抽象类
-
抽象类的子类,必须重写抽象父类中所有抽象方法,否则,编译无法通过而报 错, 除非该子类也是抽象类
接口实现类
//这是一个接口
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();
}
}
使用总结:
- 实现类必须实现接口的所有方法,但是实现类可以有接口没有的方法(方法数量:实现类>接口)
- 实现类的方法修饰符的权限必须大于接口的方法修饰符,也就是实现类的方法的可见性>接口的方法的可见性。
- 实现类可以有自己的属性,比如smallXeon有num,name属性。
- 为什么使用接口,最大目的也应该是代码重用吧,对于业务逻辑一样的类(内部实现不一样),可以直接定义接口,然后不同的业务使用不同的实现类就好了
抽象类-接口-实现类
抽象类:实现抽象层的业务方法。一般是诸如生命周期,业务流程之类的,尽量不涉及到具体实现。
接口:定义如何使用。包括外部程序如何调用,以及自己的内部程序之间如何调用。
实现类:关注于具体问题实现。
例子:退款流程需要兼容到一手退款流程
- 原始类
//退款类(原始类:最底层的方法逻辑)
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();
}
}
网友评论