# java201904003 **Repository Path**: GUOSD/java201904003 ## Basic Information - **Project Name**: java201904003 - **Description**: 重写 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-04-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java201904003 #### 介绍 重写 #### 软件架构 软件架构说明 #### 你急 1. 多态 1.1多态 子类继承了父类的行为方法,子类对于继承的父类的行为方法可以进行覆盖和扩展; 子类的行为方法覆盖了父类同名的行为方法叫做重写(override); 重写是多态的一种体现形式; 溯型是多态的另外一种形式;(使用父类类型变量指向子类的实例对象)(父类代替子类) 溯型分为向上和向下溯型两种方式; 多态可以从两个角度去解释: 子类角度: 子类覆盖父类的同名的行为方法(重写) 父类角度: 父类代指子类(向上溯型)(使用父类类型变量指向子类的实例对象) 软件工程原则: 面向父类的编程(面向接口的编程) 高内聚低耦合; 1.2 重写 重写是在继承中,子类覆盖父类同名的方法的一种行为; 重写的条件: 重写的方法(子类同名方法)与被重写的方法(父类同名方法)名相同,参数列表也必须相同; 子类同名的方法的返回值类型必须和父类的方法的返回值类型相同 (或者子类的返回值能够默认自动转换为父类类型[向上溯型],基本类型和包装类类型之间的默认转换不可以); 补充:如果父类的返回值类型时对象类型,则子类的返回值类型可以是父类返回值类型的子类类型; 子类的同名方法的访问控制修饰符的范围必须大于等于父类的同名方法的访问控制修饰符的范围; 子类的同名方法抛出的异常范围必须小于等于父类同名方法抛出的异常范围; 如果父类的某个方法不允许子类重写,则使用final进行修饰; 注意: 重写中的子类的同名方法可以使用@Override注解;(也可以不使用) 父类的静态方法不构成重写; 父类的final方法不能重写; 父类和子类的同名属性之间不构成重写; 子类重写父类的同名方法,可以借用ide工具, 右键--source--override/implements methods,然后选择所需要的重写方法即可; 1.3 父类指代子类 使用父类类型的变量指向子类类型的实例对象; 语法: 父类类型 变量名 = new 子类类型(); 解析: 等号左边是父类类型,等号右边是子类的实例对象; 注意: 使用父类指代子类,也叫作向上溯型;(默认自动转换) 将指代子类的父类类型重新强制转换为子类类型,叫做向下溯型;(强制转换) 注意:向下溯型只能转换指代子类的父类,如果是直接创建的父类强制向下溯型, 运行时会报错误(运行时异常);(参考代码:com.yuw.overridedemo2类中的方法:test02) 使用指代子类的父类,调用的同名属性是父类的属性; (因为属性不构成重写)(参考代码:com.yuw.overridedemo3类中的方法:test03) ★★ 只有类的方法会重写,构成多态; 类的属性不会重写,不构成多态; (参考代码:com.yuw.overridedemo3类中的方法:test03) 教材:P187-P188 ★★ ★★ 使用指代子类的父类,只能调用子类继承到的或者重写的与父类同名的方法, 但是调用的方法还是子类的实现方法;(以父类的名义调用,实际执行者还是子类) (参考代码:com.yuw.overridedemo3类中的方法:test03) (也就是,调用的方法只能是与父类同名的或者继承自父类的方法,不能是子类新增的方法) (参考代码:com.yuw.overridedemo2类中的方法:test01) 在使用new调用子类的构造方法创建实例对象时,如果子类调用的父类的构造方法中又调用了父类中被子类重写的方法, 虽然是在父类的构造方法之中进行的调用,但是执行时实际调用的方法还是子类重写之后的方法; ★★ 应用场景: 变量声明;方法调用(实参和形参之间)、数组集合(数组声明为父类类型,可以存入所有的子类类型) 软件工程原则: 现象接口的编程(面向父类的编程) 2.static关键字 static 表示的是静态的,是常驻内存的(从创建开始一直到程序结束); static关键字可以修饰对象有 方法、成员属性、语句块; static修饰的对象时静态对象,是属于整个类所有,也叫作类方法、类变量、类语句块; 不使用static修饰的对象是属于这个类的某一个实例对象所有; 所有非静态的成员变量也叫作实例变量; 静态对象的作用域范围: 整个类; 静态对象的生命周期: 从类加载到jvm中开始,一直到所在的程序结束为止; 所以说,静态对象时常驻内存的; ★ 成员变量和成员方法需要使用类的实例变量进行访问;需要先new实例变量,然后才能调用; 静态方法和静态属性使用类的名字直接访问,属于全类所有;直接通过类名访问即可; ★ static修饰的方法叫做静态方法; 可以通过类名直接调用;是全类所有的方法; 静态的方法只能调用静态的方法或静态的属性; 非静态的方法可以访问所有的属性和方法;【静态的只能调用静态的;非静态的可以调用所有的】 静态方法没有重写(没有多态);(静态方法可以重载、可以继承) static修饰的成员变量叫做静态成员变量; 静态的成员变量属于全类所有,可以通过类名直接访问; 一个类的多个实例对象可以通过静态的属性进行数据共享;【一般不推荐】 static修饰的语句块叫做静态语句块; 使用static修饰的的语句块叫做静态语句块; 静态语句块在类加载到jvm解释执行时会执行静态语句块,且只知执行一次; 一般用于类中的一些初始化处理; 扩展问题: 静态语句块和构造方法那个先执行? 静态语句块和非静态语句块的区别? 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)