面向对象编程之抽象类与接口

一、抽象类
1.什么是抽象类?
包含抽象方法的类被称为抽象类。用关键字为abstract来定义。
定义一个抽象类:
在这里插入图片描述
2.抽象类的使用原则
(1)抽象类不能被实例化;
(2)如果一个非抽象类继承了抽象类,那么这个类必须重写抽象类方法;
(3)如果是抽象类继承了抽象类,作为派生类可以不实现基类的抽象方法;
(4)private和abstract不能同时出现;
(5)抽象类里面可以包含非抽象方法;
(6)访问权限:public >proteced>default(包访问权限)>private;
3.抽象类相关规定
(1)在抽象类中也允许提供构造方法,并且子类也照样遵循实例化流程。实例化子类时一定先调用父类构造方法。
(2)如果父类没有无参构造,那么子类构造必须使用super明确指出使用父类那个构造方法。
(3)如果无构造方法,那么对象属性一定都是其对应数据类型的默认值。
4.关于对象的实例化
(1)对象实例化的步骤:进行类加载;进行类对象的空间开辟;进行类对象中的属性初始化;
5.抽象类中需要注意的
(1)抽象类中允许不定义任何的抽象方法,但是此时抽象类依然无法直接创建实例化对象
(2)抽象类一定不能使用final声明,因为使用final声明的类不允许有子类;而抽象类必须有子类;相应的,抽象方法也不能使用private定义,因为抽象方法必须要能被覆写
(3)抽象类也分为内部抽象类和外部抽象类。内部抽象类中可以使用static定义来描述外部抽象类
二、模板设计模式
1.模板方法模式
在⼀个⽅法中定义⼀个算法的⻣架,⽽将⼀些步骤延迟到⼦类中。模板⽅法使得⼦类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
以下是一个简单的模板设计模式:
abstract class BankTemplate {
public final void takeNumber() {
System.out.println(“1,取号”);
}

public abstract void transact();

public final void evaluate() {
    System.out.println("3,评价");
}

public final void process() {
    takeNumber();
    transact();
    if(isevaluate()){
        evaluate();
    }

}
public boolean isevaluate(){
    return true;
}

}
class User1 extends BankTemplate {
@Override
public void transact() {
System.out.println(“2,取一个亿”);
}

    public boolean isevaluate(){
        return true;
    }
}
 class User2 extends BankTemplate {
    @Override
    public void transact() {
        System.out.println("2,存一个亿");
    }
    @Override
    public boolean isevaluate() {
        return true;
    }


}

class TestDemo {
public static void main(String[] args) {
User1 user1=new User1();
user1.process();
User2 user2=new User2();
user2.process();

}

}
三、接口
抽象类与普通类相⽐最⼤的特点是约定了⼦类的实现要求,但是抽象类存在单继承局限。如果要约定⼦类的实现要求并避免单继承局限就需要使⽤接⼝。
定义一个简单的接口:
在这里插入图片描述
(1)接口就是抽象方法和全局常量的集合,在java中接口使用interface关键字定义,为了区分接口,建议在所有接口前面追加字母“I”。
(2)接口中的数据成员默认为public static final ;接口中的方法默认为public abstract;
(3)接口中不能有已实现的方法;
(4)接口的出现解决了java的单继承问题;
(5)接口不能实例化:
(6)接口可以继承多个接口,此时的接口拥有了继承的接口里的抽象方法;
(7)如果一个抽象类继承了接口,那么抽象类里面可以不实现接口的方法,但是如果再有一个普通类继承了此抽象类,那么普通类一定要实现接口和抽象类里面的抽象方法。
2.接口的应用
接⼝在实际开发之中有三⼤核⼼应⽤环境:
①定义操作标准
②表示能⼒
③在分布式开发之中暴露远程服务⽅法
四、抽象类与接口的区别
在这里插入图片描述
除了单继承的局限之外,实际上使⽤抽象类和接⼝都是类似的。在实际开发中,抽象类的设计⽐接⼝复
杂。现在要求掌握的就是如何定义接⼝以及更好的实现⼦类。

  1. 接⼝是Java的核⼼,慢慢会学到接⼝更多的使⽤与设计。
  2. 开发之中优先考虑接⼝,以避免单继承局限。
  3. 抽象类是模板,有层次感。
  4. 接⼝则更关⼼⾏为与混合。

五、工厂设计模式
java基础要求掌握三种重点设计模式:工厂、代理、单例。
1.简单工厂模式:专⻔定义⼀个类⽤来创建其它类的实例,被创建的实例通常都具有共同的⽗类。
(1)概要:⼀个抽象产品类;具体产品类:⼀个⼯⼚
(2)优点:简单易于实现;把类的实例化交给⼯⼚,易于解耦
(3)缺点:添加具体产品需要修改⼯⼚违反OCP开放封闭原则
2.⼯⼚⽅法模式:定义⼀个⽤来创建对象的接⼝,让⼦类决定实例化哪⼀个类,让⼦类决定实例化延迟到⼦类。
⼯⼚⽅法模式是针对每个产品提供⼀个⼯⼚类,在客户端中判断使⽤哪个⼯⼚类去创建对象
(1)概要;⼀个抽象产品类:多个具体产品类;⼀个抽象⼯⼚:多个具体⼯⼚ - 每⼀个具体产品对应⼀个具体⼯⼚
(2)优点:降低了代码耦合度,对象的⽣成交给⼦类去完成;实现了开放封闭原则 - 每次添加⼦产品 不需要修改原有代码
(3)缺点:增加了代码量,每个具体产品都需要⼀个具体⼯⼚;当增加抽象产品 也就是添加⼀个其他产品族 需要修改⼯⼚ 违背OCP
3.抽象⼯⼚模式:提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆需指定它们具体的类。
⼯⼚⽅法模式和抽象⼯⼚模式基本类似,可以这么理解:当⼯⼚只⽣产⼀个产品的时候,即为⼯⼚⽅法模式,⽽⼯⼚如果⽣产 两个或以上的商品即变为抽象⼯⼚模式。
我们在抽象⼯⼚接⼝中新增创建系统的⽅法,并由实例⼯⼚类去实现。
(1)概要:多个抽象产品类;具体产品类;抽象⼯⼚类 - 声明(⼀组)返回抽象产品的⽅法;具体⼯⼚类 - ⽣成(⼀组)具体产品
(2)优点:代码解耦;实现多个产品族(相关联产品组成的家族),⽽⼯⼚⽅法模式的单个产品,可以满⾜更多的⽣产需求很好的满⾜OCP开放封闭原则;抽象⼯⼚模式中我们可以定义实现不⽌⼀个接⼝,⼀个⼯⼚也可以⽣成不⽌⼀个产品类 对于复杂对象的⽣产相当灵活易扩展
(3)缺点:扩展产品族相当麻烦 ⽽且扩展产品族会违反OCP,因为要修改所有的⼯⼚;由于抽象⼯⼚模式是⼯⼚⽅法模式的扩展 总体的来说 很笨重
4.代理设计模式(重点)
两个⼦类共同实现⼀个接⼝,其中⼀个⼦类负责真实业务实现,另外⼀个⼦类完成辅助真实业务主题的
操作。
范例:实现代理模式
interface ISubject {
public void buyComputer() ; // 核⼼功能是买电脑
}
class RealSubject implements ISubject {
public void buyComputer() {
System.out.println(“买⼀台外星⼈电脑”) ;
}
}
class ProxySubject implements ISubject {
private ISubject subject ; // 真正的操作业务
public ProxySubject(ISubject subject) {
this.subject = subject ;
}
public void produceComputer() {
System.out.println(“1.⽣产外星⼈电脑”) ;
}
public void afterSale() {
System.out.println(“3.外星⼈电脑售后团队”) ;
}
public void buyComputer() {
this.produceComputer() ; // 真实操作前的准备
this.subject.buyComputer() ; // 调⽤真实业务
this.afterSale() ; // 操作后的收尾
}
}
class Factory {
public static ISubject getInstance(){
return new ProxySubject(new RealSubject()) ;
}
}
public class Test{public static void main(String[] args) {
ISubject subject = Factory.getInstance() ;
subject.buyComputer() ;
}
}
代理模式的本质:所有的真实业务操作都会有⼀个与之辅助的⼯具类(功能类)共同完成。
代理模式在JavaEE中有着⼴泛的应⽤。 EJB、 WebService, Spring等技术都是代理模式的应⽤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值