面向对象

对象

  • 万物皆对象
  • 用来描述客观事物的一个实体,有一组属性和方法构成

    面向对象

  • 人关注对象

  • 人关注事物信息

  • 类是模子,确定对象将会拥有的特征(属性)和行为(方法)

  • 类的特点

    • 类是对象的模型
    • 具有相同属性和方法的一组对象的集合

      属性

      对象具有的各种静态属性:“有什么”

      方法

      对象具有的各种动态行为:“能做什么”

      类和对象的关系

  • 类是抽象的概念,仅仅是模板

  • 对象是一个你能够看得到、摸得着的具体实体
  • 类是对象的类型
  • 对象是特定类型的数据
  • 具体开发过程中,先定义类再实例化对象

    单一职责原则

  • 单一职责原则,也称为单一功能原则

  • 英文Single Responsibility Principle 缩写SRP
  • 是面向对象设计的一个重要原则
  • 一个类,应该有且只有一个引起变化的原因
  • 在程序设计中,尽量把不同的职责放在不同的职责中,即把不同的变化原因封装到不同的类中

    对象实例化

    实例化对象的过程可以分为两部分:

  • 声明对象 Cat one

  • 实例化对象 new Cat()
  • Cat one = new Cat()

每次new对象会产生新的实例化对象:

  • Cat one = new Cat()
  • Cat two = new Cat()

多个对象可以指向同一块实例化空间:

  • Cat one = new Cat()
  • Cat two = one

对象必须实例化之后才能使用。
对象间的引用传递,实际上是传递堆空间的使用权。

构造方法

  • 构造方法与类同名且没有返回值
  • 构造方法的语句格式
  • 只有在对象实例化的时候才调用
  • 当没有指定特定的构造方法,系统会默认添加一个无参构造方法
  • 当有指定特定的构造方法,无论有参无参,都不会自己添加无参的构造方法
  • 一个类可以有多个构造方法

    1. public 构造方法名(){
    2. //初始化代码
    3. }

    this关键字

  • this:当前对象的默认引用

  • this的使用

    • 调用成员变量,解决成员属性和局部变量重名冲突
    • 调用成员方法
    • 调用重载的构造方法

      封装

      封装的特点

  • 将类的某些信息隐藏在类的内部,不允许外部程序直接访问

  • 通过该类提供的方法对隐藏的信息的操作和访问
  • 隐藏对象的信息
  • 留出访问的接口
  • 只能通过规定的方法访问数据
  • 隐藏类的实例细节,方便修改和实现

  • 作用

    • 管理Java文件
    • 解决同名文件冲突
  • 定义包
    • package 包名;例:package com.zhang.animal;
    • 必须放在Java源文件的第一行
    • 一个Java源文件只能有一个package语句
    • 包名全部英文小写
    • 命名方式:域名倒叙+模块+功能
  • 导入包
    • 导入包中全部类:import com.zhang.*;
    • 导入包中指定类:import com.zhang.animal.Cat;
  • 常用系统包

    • java.lang:包含java语言基础的类
    • java.util:包含java语言中各种工具类
    • java.io:包含输入、输出相关的类

      static

  • static+属性—-静态属性

  • static+方法—-静态方法
  • static+类 —- 不存在
  • static+方法内部属性—-不存在

静态成员随类加载产生,直至类销毁才回收

静态方法

  • 可以直接调用同类中的静态成员
  • 不可以直接调用同类中的非静态成员
  • 可以通过实例化对象,通过对象调用非静态成员

    代码块

  • 通过{}可以形成代码块

  • 方法内的代码块:普通代码块
  • 类内的代码块:构造代码块
  • 构造代码块前+static:静态代码块

代码块执行顺序:

  1. 无论实例产生多少对象,静态代码块只执行一次
  2. 构造代码块随实例化过程调用
  3. 普通代码块随方法调用执行

    封装综合案列

    Java继承

    特性

  • 代码复用
  • 缩短开发周期
  • 介绍

    • 一种类与类之间的关系
    • 使用已存在的类的定义作为基础建立新类
    • 新类的定义可以增加新的属性和方法,也可以继承父类的功能,但不能选择性继承父类
    • 父类/基类 子类/派生类

      继承的关系

      满足“A is a B”的关系就可以形成继承关系

      实现继承(Java中只有单继承)

      1. class Animal{}
      2. class Dog extends Animal{}
      3. class Cat extends Animal{}

      方法重写(方法重写存在,属性重写不存在)

  • 规则

    • 在子类中定义
    • 方法名
    • 参数类型、顺序、个数
  • 方法重写VS方法重载

    • 方法重写
      • 在满足继承关系的子类中
      • 方法名、参数个数、顺序、类型与父类、返回值相同
      • 访问修饰符的限定范围大于等于父类方法
    • 方法重载
      • 在同一个类中
      • 方法名相同
      • 参数列表不同
      • 返回值类型、访问修饰符任意

        访问修饰符

  • 公有的:public

  • 受保护的:protected
  • 默认
  • 私有的:private | 访问修饰符 | 本类 | 同包 | 子类 | 其他 | | —- | —- | —- | —- | —- | | private | √ | | | | | 默认 | √ | √ | | | | protected | √ | √ | √ | | | public | √ | √ | √ | √ |

super

  • 子类访问父类成员
    • 访问父类成员方法super.print();
    • 访问父类属性super.name;
    • 访问父类构造方法super();
  • super
    • 子类的构造方法调用过程中必须调用父类的构造方法
    • 没有显示调用,系统会默认调用父类的构造方法
    • 没有显示调用并且父类没有构造方法,则编译报错
    • 使用super调用父类的构造方法必须放在子类构造方法的第一行
  • super VS this

    • this:当前类对象的引用
      • 访问当前类的成员方法
      • 访问当前类的成员属性
      • 访问当前类的构造方法
      • 不能在静态方法中使用
    • super:父类对象的引用
      • 访问父类的成员方法
      • 访问父类的成员属性
      • 访问父类的构造方法
      • 不能在静态方法中使用
    • 构造方法调用时,super和this不能同时出现

      实例化顺序QQ截图20210720161407.png

      Object类

  • Object类是所有类的父类

  • 一个类没有使用extends关键字明确标识继承关系,则默认继承Object类(包括数组)
  • Java中每个类都可以使用Object类中的方法
  • Object类常用方法
    • toString():返回当前对象本身的有关信息,按字符串对象返回
    • equals():比较两个对象是否是同一个对象,是则返回true
    • hashCode():返回该对象的哈希代码值
    • getClass():获取当前对象所属的类信息,返回Class对象

      final

  1. 修饰类不允许被继承
  2. 修饰方法不允许被子类重写
    1. 修饰的方法可以被继承
    2. 不能修饰构造方法
  3. 修饰变量表示不允许修改
    1. 方法内部的局部变量>在使用之前被初始化赋值即可
    2. 类中的成员变量>只能在定义时或构造代码块、构造方法中进行初始化设置
    3. 基本数据类型的变量>初始化赋值后不能修改
    4. 引用类型的变量>初始化之后不能再指向另一个对象,但指向的对象的内容是可变的
  4. 可配合static使用
  5. 使用final修饰可以提高性能,但会降低可扩展性

    注解

  • JDK1.5版本引入的一个特性
  • 可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
  • 注解的分类
    • 按照运行机制分
      • 源码注解
      • 编译时注解
      • 运行时注解
    • 按照来源分
      • 来自JDK的注解
      • 来自第三方的注解
      • 我们自己定义的注解
  • 元注解:修饰注解的注解