Java 面向对象2

继承

  1. 概念
    • 一种类与类之间的关系
    • 使用已存在的类定义作为基础建立新类
    • 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但 不能选择性地继承父类
    • 满足 “A is a B”的关系就可以形成继承关系
    • 子类可以访问父类非私有成员
    • 父类不可以访问子类特有成员
  2. 方法重写
    • 语法规则
      • 在子类中定义,去重写父类的方法
      • 方法名相同,参数列表相同(参数顺序、个数、类型)
        • 方法名、参数列表都要与父类继承的方法相同
      • 访问修饰符
        • 允许改变,但是访问范围需要大于等于父类的访问范围
      • 与方法的参数名无关
      • 方法返回值
        • 当方法返回值是void 或基本数据类型时,必须相同;当返回值是引用类型时,可以是父类或其子类
      • 方法的返回值和访问修饰符是可以允许有变化的(有条件的)
    • 当子类重写父类方法后,子类对象调用的是重写后的方法。
    • super:父类对象的引用 super.父类方法名()
    • 父类的构造不允许被继承;不允许被重写,但是会影响子类的实例化过程
  3. 特点
    • 利于代码复用
    • 缩短开发周期
  4. 语法
    • 使用 extends 实现封装
    • 单一继承,只能有一个父类
    • 名词解释
      • 父类(基类)
      • 子类(派生类)
    • 继承后的初始化顺序
      • 父类静态成员 -> 子类静态成员 -> 父类对象构造 -> 子类对象构造
      • 访问修饰符不影响成员加载顺序,跟书写位置有关
  5. super
    • 代表父类引用
      • 访问父类成员方法
        • super.print();
      • 访问父类属性
        • super.name;
      • 访问父类构造方法
        • super()
    • 子类的构造的过程中必须调用其父类的构造方法
    • 如果子类的构造方法中没有显式标注,则系统默认调用父类无参的构造方法
    • 如果子类构造方法中既没有显式标注,且父类中没有无参的构造方法,则编译错误。
    • 子类构造默认调用父类无参构造方法,可以通过 super() 调用父类的允许被访问的其他构造方法,super() 必须放在子类构造函数有效代码的第一行。
    • 构造方法调用时,super 和 this 不能同时出现
  6. Object 类
    • 概念
      • Object 类是所有类的父类
      • 一个类没有使用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组)
      • Java 中的每个类都可以使用 Object 中定义的方法
  7. final 关键字
    • final class
      • 该类没有子类
      • public final class | final public class 写法都行
    • final 方法
      • 该方法不允许被子类重写,但是可以正常被子类继承使用
    • final 变量
      • 方法内局部变量
        • 只要在具体使用之前进行赋值即可,一旦赋值不允许修改
      • 类中成员属性
        • 赋值过程
          • 定义的时候直接初始化
          • 构造方法中
          • 构造代码块
      • 基本数据类型的变量
        • 初始赋值之后不能更改
      • 引用类型的变量
        • 初始化之后不能再指向另一个对象,但对象的内容是可变的
    • final + static 定义后,在程序运行中不允许二次修改。
      • 可以修饰方法和变量
      • 修饰配置信息 public static final String URL = “www.xxx.com
    • final 不允许加载构造方法前面
    • 使用 final 修饰可以提高性能,但会降低可扩展性
  8. 注解
    • JDK1.5 版本引入的一个特性
    • 可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
    • 一种特殊的标记
    • 常用注解
      • @Override 针对父类方法进行重写的形式
    • 分类
      • 按照运行机制分
        • 源码注解
          • 注解只在源码阶段保留,在编译阶段会被丢弃。例如:@Overide
        • 编译时注解
          • 注解会在编译时期保留,在加载 class 文件时会被丢弃。例如:@NotNull
        • 运行时注解
          • 在运行阶段还起作用,甚至会影响运行逻辑的注解。@Autowired
      • 按照来源分
        • 来自 JDK 的注解
          • @Override
        • 来自第三方的注解
          • 框架的注解
        • 我们自定义的注解
      • 元注解
        • 对注解进行注解
          • 对注解进行标注
        • @Target 限定注解可以用在什么地方

访问修饰符

  1. 公有的 :public
    • 允许在任意位置访问
  2. 私有的:private
    • 只允许在本类中进行访问
  3. 受保护的:protected
    • 允许在当前类、同包子类/非子类、跨包子类调用、跨包非子类不允许
  4. 默认
    • 允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用