• OOP面向对象编程


    类和对象

    什么是类?什么是对象?

    • 类,变量和方法组成的一种新的数据类型——引用类型
    • 现实生活是由很多对象组成的,基于对象抽象了类

    类中可以包含:

    • 对象的属性、特征、数据,设计为成员变量
    • 对象的行为、动作、功能,设计为方法

    对象: 软件中真实存在的单个的个体、东西
    类: 类型 / 类别,代表一类个体

    • 类是对象的类别 / 模板 / 图纸
    • 对象是类的具体的实例
    • 类是一种引用数据类型

    类中包含:
    成员变量 ------- 对象的属性
    方法 ------------- 对象的行为、功能

    声明类型的引用变量,指向对象

    this关键字

    this:指代当前对象,
    只能用在方法中,方法中访问成员变量之前默认有个this
    this指代当前对象,哪个对象调用方法,this指的就是哪个对象

    • this.成员变量名 —— 访问成员变量
    • this.方法名() —— 调用方法
    • this() ———— 调用构造方法

    当成员变量与局部变量同名时,若想访问成员变量,则this不能省略

    构造方法

    构造函数、构造器、构建器、
    好处: 复用给成员变量赋初始值的代码
    作用: 给成员变量赋初始值
    语法: 与类同名,没有返回值类型(连void都没有)
    调用: 在创建new对象时被自动调用

    • 若自己不写构造方法,则编译器默认提供一个无参构造方法,若自己写了构造方法,则不再默认提供无参构造,无参构造会被覆盖
    • 构造方法可以重载

    继承 extends

    • 通过extends实现继承
    • 作用:实现代码复用
      超类、父类、基类 -> 共有属性和行为
      派生类、子类 -> 特有的属性和行为
    • 派生类可以访问超类的和派生类的,但超类不能访问派生类的
    • 一个超类可以有多个派生类,但一个派生类只能有一个超类,称为单一继承
    • 继承具有传递性

    super

    指代超类的成员变量
    super . 成员变量名 -> 访问超类的成员变量
    super . 方法名() -> 调用超类的方法
    super()-> 不写且默认有该关键字调用超类的无参构造方法

    • 当超类成员变量和派生类成员变量同名时,super指超类的,this指派生类的
    • 若没有同名现象,则写super和this是一样的

    Java规定: 构造派生类之前必须先构造超类
    为了保证这个规则,Java做了两种操作

    1. 在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
      注:super()调用超类构造方法必须位于派生类构造方法的第一行
    2. 在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供

    方法的重写(override /overriding)

    • 发生在父子类中,方法名相同,参数列表相同
    • 重写方法被调用时,看对象的类型执行方法,即new谁就调用谁的方法

    final

    表示最终的,不可改变的
    修饰变量:表示变量不能被改变
    修饰方法:表示方法不能被重写
    修饰类:表示类不能被继承

    抽象 abstract

    只有方法的定义,没有具体的实现(连{}都没有)

    包含抽象方法的类必须是抽象类
    由abstract修饰
    抽象类不能被实例化(new对象)
    抽象类是需要被继承的,派生类有两种处理方法

    1. 也声明为抽象类
    2. 必须重写所有抽象方法

    抽象类的意义

    1. 封装共有的属性和行为,实现代码复用
    2. 可以包含抽象方法,为所有派生类统一入口(名字统一),强制必须重写

    接口

    是一种引用数据类型
    由interface定义
    只能包含抽象方法(常量、默认方法、静态方法、私有方法)
    接口不能被实例化(new对象)
    接口是需要被实现的,实现类:必须重写接口中的所有抽象方法
    注意:重写接口中的抽象方法时,必须加public
    一个类可以实现多个接口。若又继承又实现,先继承再实现
    接口可以继承接口

    接口的应用:

    1. 接口是对继承单根性的扩展 实现多继承
    2. 接口是一种标准、规范,表述具备某种功能
      实现了某接口就具备某个功能,不实现接口就不具备那个功能

    类间关系
    类和类 -> 继承+
    接口和接口 -> 继承
    类和接口 -> 实现

    多态

    向上造型/自动类型转换

    1. 超类型的引用指向派生类的对象
    2. 属性看引用类型的

    Animal o new Animal();
    Dog o = new Dog();
    Animal o = new Dog(); 把子类造成父类
    Dog o new Animal //编译错误

    应用1:
    将超类型(Animal)作为参数类型
    传递派生类(Dog Chick Fish) 对象
    以扩大方法的应用范围
    实现代码服用
    应用2:
    将不同对象(Dog chick Fish)
    统一封装到超累数组 (Animal数组) 中来访问
    实现代码服用

    向下转型
    向下转型/强制类型转换,成功的条件只有如下两种
    1 引用所指向的对象,该类型
    2 引用所指向的对象,实现了该接口或继承了该类
    强转是若不符合如上条件,则发生 ClassCastException 类型转换异常
    何时需要强转:若想访问的属性/行为在超类中没有,则需要强转
    建议:在强转之前通过 instanceof关键字 判断引用指向的对象是否是该类型

    引用类型数组
    数组元素引用类型的数组,即为引用类型数组

    补充

    高质量代码
    复用
    扩展
    维护
    移植
    健壮
    可读
    性能

    面向过程:

    以方法为单位来解决问题,比较合适简单的业务(大象装冰箱、银行取钱)

    面向对象:

    以对象为单位来解决问题,比较合适复杂的业务(造汽车,造航母)

    OO: (Object Oriented)面向对象
    OOA: (Object Oriented Analysis)面向对象分析
    OOD: (Object Oriented Design)面向对象设计
    OOAD:面向对象分析与设计
    OOP: (Object Oriented programming)面向对象编程

    默认值规则:

    byte、short、int、long、char -> 0
    float、double -> 0.0
    boolean -> false
    引用类型 -> null

    内存管理:

    由JVM来管理
    堆: new出来的对象(包括实例(成员)变量、数组的元素、方法的地址)
    栈: 局部变量(包括方法的参数)
    方法区: .class字节码文件(包括所有方法、静态变量)

    泛化

    1. 泛化:从程序设计角度而言叫泛化,从代码实现角度而言叫继承,泛化就是继承
    2. 继承要符合is(是)的关系
    3. 继承的是父类的成员变量和普通方法,不包括构造方法,父类的构造方法是被子类通过super()来调用的

    内部类

    特点
    内部类中可以直接访问外部类的成员
    内部类中有个隐式的引用指向了创建它的外部类对象 外部类名.this

    成员内部类

    1. 类中套类,外面的称为外部类,里面的称为内部类
    2. 内部类通常只服务于外部类,对外不具备可见性
    3. 内部类对象通常在外部类中创建
    4. 内部类可以直接访问外部类的成员,在内部类中有个隐式的引用指向创建它的外部类对象。隐式的引用:外部类名.this
    5. 何时用:若A类(Baby)只让B类(Mama)用,并且A类(Baby)还想访问B类(Mama)的成员时,可以设计成员内部类

    匿名内部类

    1. 若想创建一个派生类的对象,并且对象只创建一次,可以设计为匿名内部类,可以简化代码
    2. 注意:匿名内部类中不能修改外面局部变量的值
    3. 内部类有独立的class吗? 有

    package
    用于声明包
    作用:避免类的命名冲突
    规则:同包中的类不能同名,但不同包的类可以同名
    类的全称:包名.类名
    建议:包名常常有层次结构,所有字母都小写

    import
    用于导入类
    同包中的类可以直接访问,但不同包中的类不能直接访问,
    若想访问:
    先import导入类,再访问类
    或者类的全称,但不建议过于麻烦

    封装

    访问控制修饰符

    作用:保护数据的安全(隐藏数据、暴露行为)
    设计:数据(成员变量)私有化 private
    行为(方法)大部分公开化 public

    public 公开、任何类
    private 私有的,本类
    protected 受保护的,本类,子类、同包类
    默认的:什么也不写,本类、同包类(Java不建议)

    访问权限由低到高依次为:
    private < 默认的 < protected < public

    • 类的访问权限只能是public或默认的类中成员的访问权限如上四种都可以

    • 成员内部类充当成员不是类

    由static 修饰的成员变量即为静态变量
    成员变量分两种:
    1、 实例变量:没有static修饰,属于对象,存储在堆中,有几个对象就有几份由对象/引用访问

    2、静态变量:有static修饰,属于类,存储在方法区中,只有一份由类名访问

    静态

    静态变量

    1. 由static修饰的成员变量
    2. 属于类,存储在方法区中,只有一份
    3. 常常通过类名点来访问
    4. 何时用:对象所共享的数据

    静态块

    • 由static修饰的语句块
    • 属于类,在类被加载期间自动执行,因类只被加载一次
      所以静态块也只执行一次
    • 何时用:初始化/加载静态资源/静态变量

    静态方法

    1. 由static修饰的方法
    2. 属于类,存储在方法区中,只有一份
    3. 常常通过类名点来访问
      静态方法中没有隐式this传递,
    4. 所以静态方法中不能直接访问实例成员(实例变量/实例方法)
    5. 何时用:方法的操作与对象无关(不需要访问对象的属性/行为)

    由static和final共同修饰的成员变量,即为常量
    常量名所有字母都大写,多个单词之间用分隔
    NAME
    CLASS_NAME
    常常通过类名来访问,不能被改变

    常量

    1. 必须声明相同初始化;
    2. 常常通过类名点来访问,不能被改变
    3. 建议:常量名

    枚举

    是一种引用数据类型
    枚举类型的对象数目是固定的,常常用于定义一组常量
    例如:季节、星期、月份、订单状态等
    枚举的构造方法都是私有的
    枚举的第一行默认都是罗列枚举对象名称

  • 相关阅读:
    【linux命令讲解大全】099.Linux常用文件传输命令详解
    kafka 三高架构设计剖析
    Motion Guided Region Message Passing for Video Captioning【论文阅读】
    瑞吉外卖学习笔记4
    Django缓存
    高性能 Java 计算服务的性能调优实战
    20221204今天的世界发生了什么
    Fiddler抓取的一些问题
    IP地址与代理IP:了解它们的基本概念和用途
    Java多线程上——基本概念及操作
  • 原文地址:https://blog.csdn.net/weixin_59095717/article/details/131095536