# qd_dz_java20200318 **Repository Path**: climpeaker/qd_dz_java20200318 ## Basic Information - **Project Name**: qd_dz_java20200318 - **Description**: Java基础:面向对象 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-03-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # qd_dz_java20200318 #### 介绍 Java基础:面向对象 #### 课堂笔记 1. 面向对象 ```aidl 1.1 构造方法 构造方法:使用于在类创建时进行初始化设置的方法;作用就是创建类时,用于初始化的方法; 构造方法比较特殊,不能使用方法名直接调用,需要使用new进行调用; 构造方法是一种特殊的方法; 语法: 访问控制修饰符 类名(函数形参列表){ 函数体; } 解析: 构造方法是一种特殊的方法; 构造方法没有返回值类型; 构造方法的方法名固定为类名,也就是构造方法的方法名和类型相同; 构造方法不能通过方法名直接调用; 构造方法可以构成重载; 构造方法不能被继承; jvm会给所有的java类提供一个默认的构造方法,该构造方法需要显式写出;一般使用 new 类名(); 调用的就是默认的构造方法; jvm提供的默认的构造方法也可以显式写出; 如果一个类中声明了一个自定义的构造方法,则jvm默认提供的构造方法就失效了,此时如果还需要调用默认的构造方法,则需要手动显式写出; 不带参数的构造方法就是jvm默认提供的构造方法的形式; 不能类的外部使用方法名直接调用,需要使用new进行调用; 构造方法之间可以相互调用,但是调用时不是使用方法名调用,而是使用 this(实参列表);形式调用; 在构造方法中,如果使用this()调用了其他的构造方法,则this()语句只能写在第一行; 如果在子类的初始化中会递归调用父类的对应的构造方法;也就是说,在子类的构造方法调用之前会先递归调用父类的构造方法, 递归到Object的构造方法结束; 在父子类的继承关系中,子类和父类的构造方法之间要保持一致: 子列有默认的构造方法,则父类必须提供默认的构造方法; 子类有自定义的构造方法,且该子类构造方法使用super调用父类的构造方法,则父类需要提供被调用的构造方法; 子类是一定会调用父类的构造方法的,如果没有显示使用super指明调用那个父类的构造方法,则默认调用父类默认的构造方法; this关键字的使用:【指代当前类的实例对象】 this用于指代当前类的一个实例对象;【类似于古代皇帝自称“朕”指代自己】 this关键字可以引出被局部变量覆盖的同名的成员变量; this(实参列表)可以在构造方法之间进行相互调用;【且该语句只能在第一行】 super关键字的使用:【指代当前类继承的父类的实例对象】 super用于指代当前类继承的父类的实例对象; super在重写中调用父类的被覆盖的同名的方法或属性;【多态-重写】 super(实参列表)用于子类的构造方法调用父类的构造方法;【且该语句只能在第一行】 1.2 面向对象的核心-多态 多态:在类的继承中,子类和父类在行为方法上的多种形态的关系;这种多态关系体现在两个方面: 1)子类角度:子类将继承的父类的行为进行覆盖和扩展;【重写】 2)父类角度:父类指代子类;【溯型】 重写:在类的继承中,子类的同名的方法覆盖了父类的同名方法; 重写的条件: 方法名相同; 参数列表相同; 返回值类型相同或者子类方法的返回值是父类方法的返回值的子类类型; 子类的访问控制修饰符的范围要大于等于父类的访问控制修饰符的范围; 子类方法抛出的异常范围要小于等于父类方法抛出的异常范围; 注意: 构造方法不能重写; 静态方法不构成重写; 重写的方法可以使用@Override注解标明,也可以不写; 子类重写了父类的方法,则通过子类调用的是子类重写之后的方法,不会再调用父类的被覆盖的方法; 如果需要在子类重写的方法中继续调用父类被覆盖的方法,则需要使用super关键字调用即可; 课下作业:重写和重载的异同点? 溯型:在类的继承中,父类类型变量和子类类型变量之间的转换关系; 向上溯型:父类类型的变量指代子类类型的变量; 父类类型 变量名 = new 子类类型(); 向下溯型:父类类型的变量强制类型转换为子类类型; 子类类型 变量名 = (子类类型)父类类型变量; 注意: 向上溯型:父类指代子类,只能调用子类重写或者继承的父类的行为方法,不能调用子类新增的行为方法; 向下溯型:只能将向上溯型的父类,转换为子类,如果是直接new创建的父类,不能转换子类; 优点:父类代替所有子类; 软件工程原则:面向接口的编程【面向父类的编程】 1.3 面向对象两大特殊类-抽象类(abstract) 抽象类:使用abstract修饰的类就是抽象类; 特点: 使用了abstract修饰; 含有抽象方法;【含有抽象方法的类一定是抽象类,抽象类不一定含有抽象方法】 抽象类不能使用new进行初始化【因为抽象类含有未实现的方法,所有才分配内存时无法确定内存的大小】 抽象类可以含有属性和普通的行为方法; 子类如果继承了抽象类,子类要么通过重写实现父类的抽象方法;子类要么也声明为抽象类; 抽象类作用: 在类进行抽象、封装时,对于一些当前无法实现的又必须存在行为以抽象方法的形式定义,这样就是抽象类存在的价值; 抽象方法: 使用abstract修饰的方法就是抽象方法; 抽象方法没有方法体,只有方法声明; 语法: 访问控制修饰符 abstract 返回值类型 函数名(函数形参列表); 特点: 抽象方法在使用之前需要进行实现;通过子类重写的方式将抽象方法的方法体补充完成的过程,就是抽象方法的实现; abstract关键字可以修饰类或者方法; 1.4 接口 接口:是一种特殊的抽象类;以至于特殊到使用 interface 关键字进行定义接口; 接口是一组行为的规范定义;【接口和抽象类的本质区别】 语法: 访问控制修饰符 interface 接口名{ // 接口变量 public static final // 接口方法 public abstract } 解析: 接口命名和类命名是一样的,一般在类命名的基础之上加一个I前缀; 访问控制修饰符只能是public或者默认类型;不能是protected或者private; 接口中定义的接口变量都是静态常量,也就是都是 public static final 类型的; 接口中定义的变量的 public static final 三个关键字可以全部或者部分省略; 接口中的方法都是公共的抽象方法,也即是 public abstract 类型,其中 public abstract可以全部或者部分省略; 接口是可以支持多继承的;作为java类只能单继承的一种补充;【类与类之间是单继承】 接口中定义的方法都是抽象方法,没有方法体;如果在接口中定义带有方法体的方法,则需要使用default关键字修饰(jdk8+支持) 接口不能直接使用new进行初始化处理; 接口的多继承: 类多继承接口,使用implements关键字; 一个类implements实现一个接口,则这个类需要实现接口的全部的抽象方法; 接口继承接口,使用extends关键字; 接口的价值和意义: 接口的多继承弥补java中只允许类单继承的局限性; 接口是一组行为规范集合体; 接口表示的是一组行为能力,一个类实现了某个接口,则表示这个类具有了某种行为能力; 1.5 static关键字 static关键字:表示的是静态,表示全类所有; 可以修饰对象: 成员变量、方法、语句块; 静态变量(类变量):由static修饰的成员变量叫做静态变量,也叫作类变量;普通的成员变量叫做实例变量; 静态变量属于全类所有,在类加载到jvm时就进行了初始化处理,并且只加载一次,而且是常驻内存的; 其他的普通成员变量是使用时进行初始化处理; 静态方法(类方法):static修饰方法就是静态方法,表示全类所有; 静态语句块:static修饰的语句块就是静态语句块;静态语句块在类加载到jvm是就会被执行,并且只执行一次,一般用于初始化处理; 注意: static修饰的变量和方法都是静态的,可以通过类名直接访问;(普通成员变量、方法需要先创建类的实例对象变量,然后在访问) static修饰的对象在类被加载到jvm时就进行初始化处理;(无论是否被调用到,都会进行初始化) staitc修饰的静态方法只能访问static修饰的方法或变量;非静态的方法可以访问静态的或者非静态的方法或变量(都可以访问); static修饰的静态语句块在类加载到jvm是就会被执行,并且只执行一次,一般用于初始化处理;类中的非静态语句块在类每次 创建一个实例对象时都会被执行; static方法中不能使用this关键字; static修饰的对象的生命周期是这个运行程序的声明周期,也就是从程序启动加载到jvm开始,到程序进程结束为止; static只能修饰成员变量,不能修饰局部变量; 1.6 final关键字 final关键字是终止、终结的作用; 可以修饰: 变量(成员变量和局部变量)、方法、类 常量:final修饰的变量叫做常量,如果结合static关键字则叫做静态常量(static final修饰的成员变量); final修饰的变量一经初始化则不允许在改变值; 终结方法:final修饰的方法是不允许子类重写的;final就把子类重写给终止了;【final对多态重写的限定】 终结类:final修饰的类是不允许子类继承的;【太监类】【final对继承的限定】 1.7 四大关键字(abstract、static、final、interface) abstract、interface和final不能同时使用; static方法中不能使用this关键字; abstract和static也不能同时使用; 1.8 面向对象 掌握四大核心:抽象、封装、继承、多态; 掌握四大关键:abstract、static、final、interface 【对核心的补充和限定】 课下作业:抽象类和接口的异同点?什么时候使用抽象类?什么时候使用接口? // over ``` 2. 内部类 ```aidl 2.1 内部类的概念 内部类:定义来一个类内部的类就是内部类; 内部类的分类: 根据内部类定义的位置可以分为: 成员内部类:定义在成员变量声明位置的内部类;使用方法和成员变量的使用方法是一样; 静态内部类:使用static修饰的成员内部类;使用方法和静态成员变量使用方法是一样; 局部内部类:定义在局部变量声明位置的内部类;使用方法和局部变量使用方法一样; 匿名内部:匿名的局部内部类;使用方法和匿名的局部变量是一样的; 解析: 各种内部类的生命周期和作用域范围与之声明的位置相关;例如:成员内部类的生命周期和作用域范围和成员变量一样;其他类推; 匿名内部类是在new的同时将抽象类或者是接口的抽象方法进行了立即实现,然后使用匿名变量的方式调用了行为方法; 什么时候使用匿名内部类?当我们只关注于动作的结果,而不关注于动作的执行者时,可以考虑使用匿名内部类; 好处:省略了抽象类或者接口的实现类,而是直接执行动作; ``` 3. 面向对象总结 ```aidl 3.1 面向对象概述 面向对象的编程思想:是接近于人类思维方式的一种编程思想;是体现高级语言的特点之一; 面向对象和面向过程的思想的差异:【思维方式的出发点】★★★★★ 面向过程的思维方式:做什么事情,考虑的是如何去做;(关于“How”的问题) “如何”就是过程 面向对象的思维方式:做什么事情,考虑的是找谁去做;(关于“Who”的问题) “谁”就是对象,对象是由类进行规范定义的,类是封装了抽象的内容(共同的属性、共同的行为)。 面向对象的核心: 抽象、封装、继承、多态【四大核心】【教材或考试:三大核心:封装、继承、多态】 面向对象补充: abstract(抽象类)、static、final【三大关键字:面向对象思想的补充】、interface(接口) 面向对象就是围绕着8核心词汇展开; 面向对象如何进行编程: 1)不管三七二十一,先创建一个类(class); 2)抽象这个类的共同的特性(属性)和共同的行为(方法),封装为类属性和行为方法; 3)创建这个类的实例进行调用使用;(创建一个个体进行调用) 面向对象的意义和目的、目标:【面向对象的目标---软件复用】 复用;【软件工程的终极目标】 ``` #### 使用说明 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/)