title: 【学习之路】Java基础面向对象三大特性等
draft: true
tags:


类和类的关系

  • A is-a B 泛化(继承 实现)

  • A has-a B 包含(组合 聚合 关联)

  • A use-a B 依赖(need-a)


封装

通过一些权限修饰符来修改类中成员的访问权限体现封装性

权限修饰符

  1. 权限修饰符的访问大小

    • public 公共的

      • 可在本类 同包 子类 当前项目中任意类的位置只要有对象就可以访问
    • protected 受保护的

      • 可在本类 同包 子类(通过子类对象在子类范围内部访问)
    • 默认不写 默认的

      • 可在本类 同包访问
    • private 私有的

      • 只能在本类访问
  2. 权限修饰符能修饰什么

    • 权限修饰符可以用来修饰类本身和类中的所有成员(程序块除外)

    • 权限修饰符从来修饰类的时候只有两个可以用(public和默认不写)

继承

通过extend关键字继承一个类,从而可以使用这个类中一些方法来增加类与类之间的拓展性

  1. 子类继承父类,通过一个关键字 extends

  2. 子类的对象可以调用父类中的(public protected)属性和方法 当做自己的来使用

  3. 子类可以添加自己独有的属性和方法

  4. 子类从父类中继承过来的方法如果不能满足子类的需要,可以在子类中重写(覆盖)父类的方法 更多的是指内容

  5. 每一个类都有继承类,如果不写extends关键字,默认继承Object,如果写了extends则继承后面的那个父类
    可以理解为Object类非常重要 是任何一个引用类型的父类(直接或者间接继承Object) Object类没有父类

  6. Java中继承是单个存在的(单继承) 每一个类只能有一个继承类(在extends关键字后面只能写一个类)
    可以通过传递的方式实现多继承的效果,还有多实现

  7. 关于this和super的使用

    • this和super都是指代词 代替的是对象

    • this代替的是当前执行方法时的那个对象不一定是当前类的

    • super代替的是当前执行方法时对象中的父类对象 空间内部都能调用一般属性和一般方法

    • 可以放置在类成员的任意位置(属性 方法 构造方法 块)
      注意调用一般方法的时候可以来回互相调用(写法 编译好用)执行可能产生问题(StackOverflowError)

    • 可以调用构造方法(放在构造方法的第一行)
      this和super在构造方法中调用另一个类构造方法不能同时出现在第一行 构造方法之间不能来回互相调用(编译就不好用)

子类继承规则

  1. 子类的权限可以大于父类

  2. 特征修饰符

    • 当父类的方法是final子类不能重写

    • 当父类的方法是static时子类不存在重写

    • 当父类方法是abstract时子类必须重写(子类是具体类就必须重写,否则子类是抽象类可以不重写)

  3. 返回值子类可以小于等于父类

  4. 子类继承父类方法名字与父类一致

  5. 子类继承父类方法参数与父类一致

  6. 异常处理

    • 如果父类方法抛出运行时异常子类可以不予理会

    • 如果父类方法抛出编译时异常

      1. 子类抛出异常的个数少于等于父类

      2. 子类抛出异常的类型小于等于父类

  7. 方法体

    • 子类的方法内容与父类不一致 每一个重载的方法执行过程不一致

多态

对象的多态性:父类的引用指向子类的对象

  1. 当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法
  2. 当调用子类特有的方法时,编译时就会报错
  3. 多态性不适用与属性

多态性省去了一些重写方法

特征修饰符

  • final 最终的 不可更改的
  • static 静态的
  • abstract 抽象的
  • native 本地的
  • transient 瞬时的
  • synchronized 同步的
  • volatile 不稳定的

fianl

  1. 修饰变量

    • 如果在定义变量时没有赋初始值
      给变量一次存值的机会(因为变量在栈内存空间内 没有默认值 如果不给机会 就没用办法使用)

    • 一旦变量被存储了一个值 若用final修饰后 则不让再次改变相当于常量

    • 注意变量类型是基本类型还是引用类型
      如果修饰的变量是基本数据类型 则变量内的值不让更改—-常量
      如果修饰的变量是引用数据类型 则变量内的地址引用不让更改—-对象唯一

  2. 修饰属性

    • 全局变量 存储在堆内存的对象空间内一个空间
      属性如果没有赋值 有默认值存在的
      属性用final修饰后 必须给属性赋初值 否则编译报错

    • 特点与修饰变量一致
      注意变量类型是基本类型还是引用类型
      如果修饰的变量是基本数据类型 则变量内的值不让更改—-常量
      如果修饰的变量是引用数据类型 则变量内的地址引用不让更改—-对象唯

  3. 修饰方法

    • 方法是最终的方法 不可更改

    • final修饰的方法 要求不可以被子类重写(覆盖)

  4. 修饰类本身

    • 类是最终的 不可以更改
      此类不可以被其他子类继承
      通常都是一些定义好的工具类

static

  1. 可以修饰:修饰属性、修饰方法、修饰块、修饰类(内部类)

  2. 修饰以后的特点

    1. 静态元素在类加载时就初始化,创建的非常早,此时没有创建对象

    2. 静态元素存储在静态元素区中,每一个类有一个自己的区域

    3. 静态元素只加载一次(只有一份),全部类对象及类本身共享

    4. 由于静态元素区加载的时候,有可能没有创建对象,可以通过类名字直接访问

    5. 可以理解为静态元素不属于任何一个对象,属于类的

    6. 静态元素区Garbage Collection(GC)无法管理,可以粗暴的认为常驻内存

    7. 非静态成员(堆内存对象里)中可以访问静态成员(静态区)

    8. 静态成员中可以访问静态成员(都存在静态区)

    9. 静态成员中不可以访问非静态成员

    10. 静态元素中不可以出现this或super关键字(静态元素属于类)

使用static修饰的方法或者变量可以使用对象调用,但不推荐这种方法因为对象可能会为null从而会被GC回收

abstract

  1. abstract可以修饰类,方法
  2. 修饰以后的特点

    1. 修饰类

      1. 使用abstract修饰类以后这个类不能再实列化(不能在new 对象)
      2. 抽象类中继续保留构造方法,方便子类实列化时调用
      3. abstract不能修饰final类
    2. 修饰方法

      1. 抽象方法没有方法体
      2. 有抽象方法的类一定是一个抽象类。但是抽象类中不一定有抽象方法
      3. 若有类继承了抽象类那么抽象类中的所有抽象方法子类都必须实现,如果这个子类也为抽象类那么可以不实现父类中的抽象方法
      4. abstract不能用来修饰私有方法,静态方法、final方法

如果有声明抽象类那么一般都需要提供这个抽象类的非抽象子类来实现抽象类中的方法。