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