zoukankan      html  css  js  c++  java
  • Java面向对象继承/重写/多态

    继承

    Java通过extends关键字实现继承,每个类至多有一个直接父类(抛弃了C++多继承,私有继承和保护继承);
    子类无法继承父类private成员/,static变量/方法;
    • 针对父类private方法,子类同名方法属于自定义方法,不存在方法重写;

    重写/覆盖(@Override)

    子类方法重写规则

    • 方法签名必须想同;
    • 重写方法返回值类型/抛出异常类型 <= 父类;
    • 重写方法访问权限 >= 父类;
    • 重写方法类型 = 父类(同为static方法/实例方法);

    方法重写(override)与方法重载(overload)

    • 方法重写:发生在父类和子类同名方法之间;
    • 方法重载:发生在同一个类中的同名方法之间;


    子类访问父类成员(被子类继承)顺序

    子类调用父类构造器(内部)

    • 子类不继承父类构造器,通过super访问;
    • super调用父类构造器,必须出现在子类构造器执行体的第一行;
    • 创建任何对象,构造器执行顺序是从所在继承树最顶层类的构造器执行;

    子类调用父类实例方法

    • 子类调用父类实例方法原则:无论方法重载/重写,优先子类,其后父类
      • 方法签名(signature):方法的方法名和参数列表;
      • 子类调用对象方法时,编译器根据方法签名依次检查该子类的重载方法(如果存在),否则查找其父类的同名方法;
    • 子类调用父类实例方法时,根据访问控制权限,
      • 内部,通过super访问父类方法;
      • 外部,通过子类引用无法访问父类重写方法,可访问父类未重写方法;

    子类访问父类static成员

    • 根据访问控制,通过父类名直接访问父类static变量/方法,无需考虑覆盖;


    子类内部访问父类实例变量(内部)

    • 无论是否同名,子类默认访问子类变量,通过super访问父类实例变量;


    多态(polymorphism)

    静态绑定与动态绑定

    绑定:确定方法调用主体的过程
    Java绑定机制:Java引用类型分为编译时类型和运行时类型;方法调用时的调用主体只有在执行过程中才被决定,而不是在编译时决定;
    子类对象调用方法时,编译器调用对象方法的方式分为静态绑定与动态绑定;
    • 静态绑定:编译时根据定义确定调用方法主体;
      • 定义如果是private/static/final/构造器方法,编译器准确知道应该调用哪个方法;
    • 动态绑定运行时确定调用方法的主体;

    子类对象调用重载方法顺序

    • 方法签名(signature):方法的方法名和参数列表;
    • 子类调用对象方法时,编译器根据方法签名依次检查该子类的重载方法,否则查找其父类的同名方法(优先子类,其后父类);
    • 虚拟机为每个类创建一个方法表(method table),便于编译器动态选择调用对象方法;

    向上转型与向下转型

    • 向上转型(upcasting)父类引用指向子类对象。编译器在编译期间仅识别父类变量是父类类型,必须使用强制类型转换将父类类型转换为子类类型;
    • 向下转型(downcasting)子类引用指向父类对象。编译器知道子类类型一定是父类类型,允许隐式的向上转型;
      • 适用场合:当调用方法时子类自定义方法时;
      • 编译阶段通过,可能出现运行抛出异常,存在安全风险,须用instanceof检查;

    多态

    • 多态:当子类继承父类/接口时重写父类方法,用父类引用向指向子类对象【向上转型】时,
      1. 编译阶段,父类对象与调用方法进行静态绑定
      2. 运行阶段,子类对象与调用方法进行动态绑定(动态绑定的前提是必须通过静态绑定);
      3. 两种阶段的绑定不一致,导致“多态”
    • 产生多态的必要条件:存在继承关系,存在方法重写,父类引用指向子类对象
    • 多态好处:编程尽量面向父类或抽象类型,通过多态降低了软件的耦合度,增强软件的扩展能力;

    intanceof运算符(对象类型转换)

    intanceof用于检查对象类型之间强制转换/对象是否实现指定接口,语法格式是:
    1. if(ReferenceName intanceof ClassName/InterfaceName) {
    2. ...
    3. }
    运算结果返回true,表示引用类型与指定类/接口之间存在继承关系,允许进行强制类型转换;
     


    final/止继承

    final变量

    final修饰的成员变量初始化后不可改变
    • final成员变量初始化必须显式初始化
    • final变量可作为“宏变量,初始值在编译时确定(类比于C++中的const运算符
    • final引用类型,实质上只保证该引用类型变量引用地址不变,并不保证所指向对象不变;

    final方法

    • final方法不可被重写,向编译器指明静态绑定;
    • final方法可以被重载
    • finalabstract不可同时使用;

    final类

    • final类不可被继承
    • final类中的所有方法自动为final方法;





















    所有博文来自个人为知笔记,内容多为读书笔记和理解内容;
  • 相关阅读:
    Manage It! Part 2 规划和组织项目
    【转载】如何迅速成为Java高手
    Eclipse中最常用的快捷键
    向SQL Server全文索引进军,艰难历程
    数据库函数整理
    ASP.NET MVC简单编程篇(一)
    SQL Server存储过程及高级应用
    定义和赋值的区别 构造函数和拷贝构造函数
    SQL Server 2000
    Coustom web control 自定义控件
  • 原文地址:https://www.cnblogs.com/yzwall/p/6637138.html
Copyright © 2011-2022 走看看