Java 面向对象2——继承

Java 面向对象2——继承

继承

  1. 指由一般类和特殊类形成的特殊类—一般类特殊结构中,将一般类和特殊类对象实例共同具有的属性和操作一次性在一般类中定义,特殊类自动拥有一般类中的属性和操作,无需再次定义
    • 是类与类之间的关系
    • 此外还有依赖、组合、聚合等关系
  2. 本质:对某一批类的抽象,从而实现对世界更好建模
  3. 使用extends字:即扩展,子类是父类的扩展
    • 格式:[修饰符] class <子类名> extends <父类名>{ //类体 }
    //例:
    class Student extends Person{
    	//类体
    }
    
    • 被继承的类称为父类、超类或基类
    • 继承的称为子类或者派生类
  4. 特性:
    • 继承关系是传递的:
      • 子类拥有父类非private的属性和方法
      • 子类可拥有自己都属性和方法
    • 能清晰体现相关类的层次结构
    • 提供软件复用功能,减少代码量的冗余度,增加程序的重用性,提高了类间的耦合性
    • 减少模块间接口和界面,大大增强了软件的易护性
    • Java只有单继承,不能多重继承,但可多层继承
      • 单继承即,一个子类只能继承一个父类
      • 多层继承即,父类被子类继承,该子类又可被别的类继承
      • 通过接口机制可实现多重继承
  5. 意义:子类可看做是父类的扩充,是父类定义更具体化的一种手段
    • 父类的表示范围更大,子类相对缩小
  6. 优点:
    • 提高了代码的复用性
    • 提高了代码的维护性
  7. 限制:
    • 不允许多重继承,但允许多层继承
    • 子类继承父类时,会继承父类全部成员
      • 对非私有成员为显示继承
      • 对私有成员为隐式继承,不可在子类中访问
    • 创建子类对象时,先调用父类某构造方法,完成父类对象创建,再调用子类构造方法,完成子类对象创建
      • 调用子类构造方法前一定会调用父类的构造方法,默认为无参构造方法
      • 以保证先实例化父类对象,再实例化子类对象
      • 子类与父类声明的成员变量被分配内存空间,但子类只能操作继承的那部分成员变量
    • 子类不能直接访问父类私有成员,需通过getter和setter方法实现
    • 继承的类与类之间产生了关系,类的耦合性增强,当父类改变,子类不得不改变,弱化了子类独立性
  8. 应用:使用时,需考虑类与类间是否存在“is…a”的关系
    • 例:teacher is a person
  9. final关键字:意为最终
    • 修饰类则其为最终类,不能被继承
    • 修饰方法,则为最终方法,不能被子类重写
    • 修饰字段和局部变量,则一旦赋值不能更改
  10. 访问继承成员时:
    • 成员变量的隐藏和覆盖:子类成员变量与父类的成员变量相同时,子类会屏蔽父类成员变量
    • 通过子类引用变量访问自己的对象时,无论属性和方法,优先考虑子类新定义的,找不到再到父类找
    • 父类引用子类对象时的成员访问:
      • 实例方法据变量引用对象的实际类型进行访问
      • 属性和静态方法据引用变量的类型进行访问

继承中的成员访问

访问特点:

  1. 采用就近原则
    • 首先在子类局部范围找,然后是子类成员范围、父类成员范围
    • 找不到则报错

访问控制符

  1. Java通过修饰符来控制类、属性和方法的访问权和其他功能,通常放在语句的最前端
    • 修饰符
      • public:公共的,对所有类可见
      • protected:受保护的,对同一包内类和子类可见
      • private:私有的,在同一类内可见
      • 默认的:在同一包内可见
    • 访问控制和继承规则:
      • 父类声明为public,子类则必须为public
      • 父类声明为protected,则子类只能为public或protected
      • 父类为默认修饰符,则子类可声明到private
      • 父类为private,则其不可被继承
    • 访问权限范围从小到大依次为:private < default < protected < public
  2. 作用
    • 设置访问许可
    • 避免外界干扰
  3. 决定成员变量和成员方法是否可被访问的两个因素
    • 成员所在类的访问控制权限
    • 成员本身的访问控制权限

权限修饰符

  1. final: 意为最终
    • 可修饰成员方法、成员变量、类
    • 效果
      • 修饰类:该类不能被继承
      • 修饰方法:该方法不能被重写
      • 修饰变量:表示该变量是常量,不能被再次赋值
  2. static:意为静态
    • 可修饰成员方法、成员变量
    • 特点:
      • 被类所有对象共享
        • 此也为判断是否使用static的条件
      • 可通过类名调用,也可通过对象名调用,推荐使用类名调用
    • 访问规则
      • 非静态成员方法:能访问静态和非静态的成员变量和成员方法
      • 静态成员方法:不能访问非静态的成员变量和方法

Object类

  1. 是所有类的顶级父类,所有类都直接或间接继承Object类
  2. 是java.lang包下的类

方法重写

  1. 或称方法覆盖,用于子类重写父类的方法
  2. 是方法的重写,与属性无关
  3. @Override:注解,意为重写
    • 注解:即有功能的注释
    • 用于检验当前方法是否是重写方法,起到校验作用
  4. 方法名和参数列表必须相同
    • 方法体可不同
  5. 子类修饰符可以比父类大 ,但不能小
  6. 抛出异常范围可以被缩小,但不能扩大
  7. 意义:父类的功能,子类不一定需要或满足
    • 若子类重写了父类的方法,此后通过子类对象调用该方法时,访问的是子类而非父类方法,相当于父类方法被隐藏
      • 子类想调用父类被重写方法,必须通过super关键字
    • 多个具继承关系的类的多态性以方法重写形式体现
  8. 不能重写的情况
    • static方法:属于类,不属于实例,不能重写
    • final:常量,无法改变
    • private:私有的
  9. 属性覆盖:父类成员在子类可见,且成员变量名相同
    • 条件: 子类与父类间存在重写关系,子类与父类成员存在覆盖关系
    • 成员方法按就近原则选用成员变量

方法重写与方法重载的区别

  1. 方法重写存在于子类与父类之间,方法重载存在于类内部成员方法之间
  2. 方法重写指子类方法与父类方法在方法名和参数列表等2个方面完全一致,而方法重载则方法名相同,但参数列表不同
  3. 方法重写时子类方法访问权限不能小于父类方法权限

你可能感兴趣的:(IT学习之旅,java基础,java)