# zb_java0727 **Repository Path**: climpeaker/zb_java0727 ## Basic Information - **Project Name**: zb_java0727 - **Description**: oop-继承、多态 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2018-07-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # zb_java0727 # 课堂笔记 ## 1 面向对象 ### 1.1 面向对象的思想 面向对象解决问题的出发点:找谁去做。【谁就是对象,对象由类进行规范定义】 面向对象核心思想:抽象、封装、继承、多态。 面向的目的:代码复用。 面向对象编程实现: (1)创建一个类; (2)编写属性; (3)编写行为方法; (4)在测试类中使用new创建一个该列的实例对象; (5)调用该实例的行为方法; ### 1.2 继承 * 继承中的构造方法的使用 构造方法不能够被继承; 子类在new创建实例对象时会逐层递归调用父类的构造方法;【先执行父类的构造方法,再执行子类的构造方法】 语法: (1)子类的构造方法会调用父类的构造方法; 子类可以通过 super(参数列表); 形式决定调用父类的那个构造方法; 如果子类的构造方法没有使用 super指明情况下,调用父类的默认的构造方法,无论是否写上 super(); (2)子类和父类的构造方法是通过递归调用的方式完成的; 代码[com.yuw.oop.constructors.*]: 参见 包:com.yuw.oop.constructors 中的代码。 * 继承中访问控制修饰符的范围 父类中那些属性和行为方法可以被子类继承,有其修饰访问控制修饰符决定; 访问控制修饰符和封装、继承的关系: | 访问控制修饰符 | 访问范围 | 是否可以被子类继承 | | --------- |:--------:| :----------: | | public | 全部【所有的类都可以访问】 | 可以继承 | | protected | 本类、同包类、所有子类 | 可以继承 | | 默认的 | 本类、同包类 | 同包子类可以继承 | | private | 本类 | 不能继承 | ### 1.2 多态 * 1 多态的概念 多态:具有继承关系的父子之间表现出来的不同的行为状态; 多态体现在以下两个方面: (1)重写和覆盖【从子类角度而言】 子类的同名的方法或属性覆盖了父类的同名的方法和属性; (2)父类指代子类【从父类角度而言】 用父类类型的变量指向子类的引用; *重写和覆盖* 重写:具有继承关系的父子类中,子类的同名方法覆盖父类的同名方法就是方法的重写; 方法重写的条件: (1)方法名相同,参数列表也必须相同; (2)返回值类型相同或兼容【子类的返回值类型能够默认转换为父类的返回值】; (3)子类的方法的访问控制修饰符范围》=父类的被重写的方法的访问控制修饰符的范围 (4)子类方法抛出的异常范围《=父类的被重写的方法抛出的异常范围; 注意: (1)构造方法不能够被重写; (2)静态方法方法不能够被重写; (3)子类重写的方法一般使用 @Override 注解;如果不使用不影响重写;【推荐使用 @Override】 (4)使用ide工具可以自动生成需要重写方法,右键--source--override and implements ...---然后选择需要重写方法 (5)如果子类重写了父类的方法,则通过子类实例对象变量调用重写的方法执行的子类的重写方法,不会再默认调用从父类继承的方法; (6)如果在子类重写的方法中,还需要调用父类的被覆盖的方法,则可以通过 super.方法名() 的方式进行调用; *属性覆盖* 子类的属性也可以覆盖父类同名的属性; 代码[com.yuw.oop.overridedemo.*]: 参见包:com.yuw.oop.overridedemo包中的类; *作业:重写和重载异同点?【每个人必须整理】* 提示: 重写是父子类之间的关系,是纵向的关系;国际矛盾 重载一个类内部各个方法之间关系,是一种横向的关系; 内部矛盾 *父类指代子类* 使用父类变量指向子类的引用。【向上溯型和向下溯型、instanceof 关键字】 语法: 父类类型 变量名 = new 子类类型(); 解析: (1)=号左侧是父类类型;=号右侧是创建了子类的实例对象; (2)虽然是一个父类类型的变量,但是在内存中创建和存储的还是子类实例对象的内容; (3)如果子类重写了父类的行为方法,实例变量.行为方法 调用是子类的行为方法; (4)使用执行子类型的变量,不能调用子类新扩展的行为方法及属性【局限性】;只能调用继承自父类的行为方法或属性; (5)指向子类实例变量的父类的引用,调用的方法是子类的方法,调用的属性(如果可以访问到)还是父类的属性; 在父类指向子类的多态下,通过父类类型的变量调用的方法是子类的;调用的属性是父类自己的【父类类型的变量名.父类的属性】; * 1 向上溯型 父类指向子类; * 2 向下溯型 将以父类类型指向子类类型的变量通过强制转换的形式将其重新转换为子类类型; Person 父类,Student 子类; 示例: Person per0 = new Student(); // 向下溯型 Student stu0 = (Student)per0; 注意: (1)只有使用父类的变量指向子类的实例对象的变量;才能通过向下溯型重新强制转换为子类; 否则,普通父类直接转换子类会报运行时错误; 代码[com.yuw.oop.overridedemo.*]: 参见包:com.yuw.oop.overridedemo包中的类; *instanceof关键字* instanceof关键字:用于判断某一实例变量是否是该类实例对象;【判断引用类型的变量的类型】 语法: 变量 instanceof 类名 解析: (1)表达式运算结果是布尔类型; (2)一个对象类型的变量是该类以及该类的所有的直接或间接父类的类型。 代码[com.yuw.oop.overridedemo.TestDriver]: 参见 包:com.yuw.oop.overridedemo.TestDriver类中的代码。 *多态:软件工程原则* 软件工程原则: 面向父类的编程;【多态的应用】【父类指向子类】【面向接口的编程】 ### 1.3 static、final、abstract、interface四大关键字 * static关键字 #### 参与贡献 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. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)