当前位置: 首页 > news >正文

面向对象——抽象类

文章目录

  • 抽象类
    • 抽象类的特点:
    • 抽象类和一般类的区别:
    • 抽象类的注意事项:

抽象类

抽象类不是一个完整的类,它一般被用作于基类(基础类)。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

语法:

public abstract class 类名{

}

  1. 抽象方法:只有方法的定义,没有方法体的实现,这种方法就是抽象方法

  2. 抽象类: 一个类中如果有抽象方法,那么这个类就是抽象类

    具体的执行过程是由子类来决定的

由于抽象类不是具体的,所以不能创建对象

// 先定义抽象类,里面有一个抽象方法
public abstract class Area{
    // 定义抽象方法
    abstract void area();
}
// A类继承抽象类
public class A extends Area{
    @Override
    void area() {
        System.out.println("我是A");
    }
}
// B类继承抽象类
public class B extends Area{
    @Override
    void area() {
        System.out.println("我是B");
    }
}
// 写一个main方法跑一下程序
public class Main {
    public static void main(String[] args) {
         A a = new A();
           a.area();
        B b = new B();
          b .area();
    }
}

抽象类的特点:

​ (1)抽象类和抽象函数都需要被abstract关键字修饰,抽象函数一定在抽象类中
​ (2)抽象类不能创建对象
​ (3)子类只有重写了父类所有的抽象函数之后,才能创建对象,否则本身也是一个抽象类

抽象类和一般类的区别:

  • 抽象类
    含有抽象方法的类就叫抽象类。而抽象方法就是被abstract修饰的方法,这个方法可以没有具体的实现。
    在抽象类的子类中必须对抽象方法进行重写,当其子类为抽象类时,可以不重写抽象方法,但在其子类中一旦有普通类,则必须重写父类继承的所有抽象方法。
    抽象类不可以实例化。抽象类的构造方法作用为初始化子类对象。
    抽象类存在的意义就是为了被继承。
    抽象类中的普通属性和普通方法都需要用子类的对象去调用。
  • 普通类
    普通类可以实例化,实例化后可以调用自己类中的属性和方法或父类的方法和属性。
    普通类的构造方法中必须要调用父类的构造方法
    如果普通类继承了抽象类,那么必须要重写所有父类的抽象方法
    普通类存在的意义就是实例化。
  • 普通类和抽象类的区别总结
    1、抽象类的存在时为了被继承,不能实例化,而普通类存在是为了实例化一个对象
    2、抽象类的子类必须重写抽象类中的抽象方法,而普通类可以选择重写父类的方法,也可以直接调用父类的方法
    3、抽象类必须用abstract来修饰,普通类则不用
    4、普通类和抽象类都可以含有普通成员属性和普通方法
    5、普通类和抽象类都可以继承别的类或者被别的类继承
    6、普通类和抽象类的属性和方法都可以通过子类对象来调用

abstract是抽象类的关键字,也是抽象方法声明上必须加的修饰符,在定义方法上它一般不能与以下几个关键字共存:

1、和static:

abstract class A {

public abtract static void method();

}

static修饰后可以直接类名调用方法,但是抽象方法没有实现体,调用无意义;

2、和final:

final修饰的类不能被继承,修饰的方法不能被重写,修饰的成员变量只能为常量;但是继承的子类要重写这个抽象方法,所以会出现矛盾;

3、和private:

抽象方法是为了让子类重写并给定实现体, 但是private修饰的方法只能本类访问,所以矛盾。

抽象类的注意事项:

抽象类不能进行实例化(对象创建)。(未来可以通过匿名类来创建它的对象)

1.语义上。自然界不存在这具体的东西,没有哪个水果可以代替”水果”这个名词,没有哪个宠物可以代替”宠物”这个名词,所以它只能是作为一个分类名词用,创建动物/宠物的实例。

2.语法上。如果可以实例化,其包含的抽象方法,在运行程序时,JVM无法执行该方法,因为方法没有方法体。

3.一般作为基类也不需要进行使用。

抽象类可以作为多态使用。例如:Motor motor = new Car();

抽象类中可以有抽象方法,也可以没有抽象方法。但是有抽象方法的类一定是抽象类。

抽象类为父类时,子类必须要重写父类中的所有抽象方法,否则其也需要定义为抽象类。(父债子偿)

相关文章:

  • C++ 异常处理机制讲解
  • 【软考 - 高级系统架构设计师】考前冲刺计划 及 国庆作息时间
  • Typescript的数组类型
  • 【分治法】第k个数(快速选择算法,结合快速排序)
  • 西瓜书研读——第四章 决策树:ID3、C4.2、CSRT算法
  • aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  • 学习小发现-04-如何从字符串中提取数字并转换为整型输出、如何在%d输入内容中判断整型并只读取数字以整型输出、scanf的各种用法
  • Python中的闭包
  • Java知识【继承中的成员访问特点】
  • <Linux进程控制(2)>——《Linux》
  • 嵌入式软件编程模式
  • VL8 使用generate_for语句简化代码
  • 从零开始搭建uni-app框架的小程序开发环境
  • 【web】TCP/UDP协议详解(字节二面:TCP三次握手、四次挥手)
  • C++打怪升级(二)- 引用详解
  • 2017届校招提前批面试回顾
  • canvas 高仿 Apple Watch 表盘
  • Effective Java 笔记(一)
  • Fundebug计费标准解释:事件数是如何定义的?
  • HomeBrew常规使用教程
  • JavaScript 基础知识 - 入门篇(一)
  • Linux Process Manage
  • Vue 重置组件到初始状态
  • 当SetTimeout遇到了字符串
  • 动态规划入门(以爬楼梯为例)
  • 高性能JavaScript阅读简记(三)
  • 关于Flux,Vuex,Redux的思考
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 批量截取pdf文件
  • 前端面试之CSS3新特性
  • 如何进阶一名有竞争力的程序员?
  • 用Python写一份独特的元宵节祝福
  • Java总结 - String - 这篇请使劲喷我
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (poj1.3.2)1791(构造法模拟)
  • (rabbitmq的高级特性)消息可靠性
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (三分钟)速览传统边缘检测算子
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 中viewstate的原理和使用
  • .net程序集学习心得
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .NET中使用Redis (二)
  • .pop ----remove 删除
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • :=
  • ??在JSP中,java和JavaScript如何交互?