Java 抽象类

面向对象编程的核心是面向抽象编程,一般依赖抽象不依赖具体

public class A{
    public void pp(Pig pig){} 如果进行切换类型,则必须进行修改源代码
}
-------------
public class A{
    public void pp(Animal animal){} 这里可以任意更换Animal的子类
}
class Pig extends Animal{}
class Cat extends Animal{}

包含了抽象方法的类叫作“抽象类”,所谓的抽象方法是指没有函数体的方法,抽象方法必须在子类中给 出具体实现,而抽象类本身不能创建对象。 public abstract class A{}

        如果一个类中有抽象方法则这个类一定是抽象类

        抽象类中可以定义的内容与普通类一样,只是可以定义抽象方法

        抽象类中可以没有抽象方法

        普通类继承抽象类必须实现抽象类中所有的抽象方法

        抽象类一般是用来定义规范的,该规范的实现是通过子类来实现的

抽象类的特点

方法只有声明没有实现时,该方法就是抽象方法【不是空实现方法体,没有{}】,需要被abstract修 饰,否则语法报错。抽象方法必须定义在抽象类中,该类必须也被abstract修饰

        抽象方法只能被public、protected或不加域修饰符修饰,抽象方法一定不能是private的

        public void pp(){}不是抽象方法,只是方法的实现为空,有方法体

        public void pp(); 没有{}才是没有方法体,才是抽象方法,当然需要添加关键字abstract 不能定义抽象构造函数

                抽象类中可以定义构造器,也可以不定义构造器,使用系统默认提供的无参构造器,但 是自定义构造器不能private

                抽象类不能是final class

不能定义抽象静态方法

        抽象类中可以有静态方法,但是必须有方法体,不能是抽象方法

        允许抽象类直接调用静态方法

抽象类不能直接创建对象,只能通过继承的方式由子类实现对应的抽象方法;

        一般的使用方法为【动物 x=new 人();】

所有抽象类的子类必须实现抽象父类中的所有抽象方法或者自己也声明成抽象类[没有实现所有的 抽象方法]

抽象类除了可以有抽象函数,也可以有非抽象函数

        没有任何限制,允许属性、方法,也允许抽象方法

抽象类不可以被实例化

是因为调用抽象方法没有意义?

        抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类 强调:注意抽象类中可以包含构造器、析构器、抽象方法和方法以及静态方法等,也可以没有抽象方法

什么时候使用抽象类

        当一个类的一个或多个方法为抽象方法时

        当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时

        当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时

抽象类和普通类的区别

        抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误

        抽象类允许(但不要求)抽象类包含抽象成员

        抽象类不能被密封

                简单说就是被final修饰的类,密封类不能被继承,防止了恶意的派生

模板模式

定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类

什么是模板模式

在模板模式Tempate Pattern中一个抽象类公开定义了总体的算法【算法骨架】,把没有办法在父类中实现的方法延迟到子类中具体实现。这种类型的设计模式属于行为模式

何时使用

为防止恶意操作,一般模板方法都加上 final 关键词

优点

        封装不变部分,扩展可变部分

        提取公共代码,便于维护

        行为由父类控制,子类实现。

缺点

每个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

分析

冒泡排序算法固定可以定义在父类中,但是两个比较的算法不同确定,所以可以将具体比较算法延迟到子类中实现。抽象父类中定义算法模板,具体的比较延迟到子类中进行实现

抽象类的作用

抽象类的作用

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组 行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现 则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可 以是不允许修改的

通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则 开闭原则OCP,抽象类是其中的关键所在

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质 上相同的具体概念的抽象

OOP的核心是面向抽象编程

        在父类中固化算法骨架,在子类中实现特殊的方法

        依赖抽象

类和类之间的耦合问题

OOP要求类内高内聚、类间弱耦合--客户需求变动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值