# Tjisejava0318 **Repository Path**: wang-junjie123/tjisejava0318 ## Basic Information - **Project Name**: Tjisejava0318 - **Description**: 面向对象-接口 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-18 - **Last Updated**: 2021-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tjise2_java20210318 #### 介绍 java基础:面向对象及其相关内容 #### 软件架构 软件架构说明 #### 课堂笔记 1. 面向对象编程 ```aidl 1.1 面向对象的理解 面向对象映射的是人类社会的思维方式; 面向对象的思维方式: 做什么事情【解决什么问题】?首先考虑的是 找谁去做? 这个 谁 就是对象; 面向对象编程的方法:一开始就创建一个类;然后通过抽象填充 属性 行为 ,这样就定义完了类,然后类和类相互调用就是面向对象的编程; 面向过程的思维方式: 做什么事情【解决什么问题】?首先考虑的是 如何去做? 这个 如何 就是过程; 1.2 面向对象的核心内容 面向对象是围绕8个词展开: 面向对象的核心:抽象、封装、继承、多态; 【面试、考试:面向对象的三大核心: 封装、继承、多态】 面向对象的补充:static、final、Abstract、interface 1.3 抽象 面向对象编程的第一步就是抽象;抽象非常重要,以至于抽象内容不准确,会造成后续的面向对象编程的各种问题; 抽象:从同类个体中将群体的共性进行抽象; 抽象的时候要从业务角度进行; 面向对象的抽象是从业务角度进行,将共性抽取出来; 共性主要从两个维度去描述: 属性; 行为 抽象的操作结果就是获取被抽象这一类个体的共同的 属性 和共同的 行为; 抽象的结果内容会封装到类中; 1.4 类和封装 类:是对对象的规范定义; 也就是在面向对象的思想中,使用类来规范定义对象; 有了类之后,可以使用new操作符创建这个类的实例对象; 封装:将抽象的结果封装到类中; 如何进行封装? 将抽象的属性 以 成员变量的形式进行封装; 将抽象的行为 以 成员方法的形式进行封装; 面向对象的封装还会使用 访问控制符 来限定被封装的属性和行为的访问范围; 这是封装的另外一个层面内容; 访问控制修饰符的访问范围: public: 任何类都可以访问; protected:同包的类以及不同包的子类; 默认的:同包的类; private:本类内部; 成员变量: 定义在类范围内的变量叫做成员变量; 成员方法: 定义在类范围的方法就是成员方法; 软件工程的封装原则: 属性一般定义为私有的 private 类型; 为私有的属性提供getter/setter方法接口,方便外部进行访问;【特殊要求除外】 行为一般定义为共有的 public 类型; 可以适当的提供构造方法;【构造方法可以重载】 1.5 构造方法 构造方法是类的行为方法中的一类特殊的方法;用于在类进行创建生产实例对象时而调用的方法; 构造方法和普通方法的区别: 构造方法名是固定的,是以类名作为构造方法名的; 构造方法没有返回值; 构造方法可以使用访问控制修饰符进行修饰,这和普通方法一样; 构造方法不能被其他的普通方法调用; 构造方法可以被 new 操作符调用; 构造方法之间可以调用,但是调用方式是通过 this(实参列表) 来进行调用;this必须放在第一行; 构造方法可以重载; 构造方法的语法规则: 每个类如果没有明确的显式写出构造方法,则由jvm默认提供一个不带参数的默认的构造方法; 如果一个类有显式的构造方法,则jvm默认提供的构造方法就失效了,如果还想使用默认的构造方法,则需要手动显式写出; 构造方法不能继承,不能重写,没有多态; 继承下的构造方法的语法: 子类在执行构造方法的同时会递归的调用父类的构造方法;【在执行子类的构造方法之前会把所有父类的构造方法执行一遍】 子类的构造方法默认调用的是父类的默认的构造方法,所以要求被调用的父类提供默认的构造方法; 如果子类需要显式的调用父类的构造方法,则需要使用 super(实参列表) 来调用父类的构造方法; super(实参列表)要求必须防在第一行; 1.5 成员变量和局部变量 成员变量: 定义在类内部的变量就是成员变量; 成员变量可以使用访问控制修饰符修饰; 成员变量声明之后有默认值;不进行初始化也可以直接使用;【根据类型而定】 成员变量的作用域范围是整个类内部;【有点类似C语言全局变量】 成员变量的生命周期是伴随在类的实例对象的生命周期而存在的; 局部变量:是定在方法体、语句块、方法声明的参数列表的变量就是局部变量; 局部变量不能使用访问控制修饰符修饰; 局部变量声明之后没有默认值,且要求局部变量在使用之前必须进行初始化赋值; 局部变量作用域范围从变量声明位置开始到其所在的语句块结束位置为止; 局部变量作生命周期从变量声明位置开始执行到其所在的语句块结束位置执行结束为止; 局部变量和成员变量同名时,局部变量的值会覆盖成员变量的值;也即是同名时使用的值是局部变量的; 判定原则: 范围最小优先原则; 就近原则; 当局部变量和成员变量同名时,成员变量的值会被覆盖;如果此时需要使用成员变量的值,需要使用 this 关键字最为前缀即可; 1.6 继承 父类角度: 继承是使用已有的类派生新的类的一种方法途径; 子类角度: 子类通过继承获取父类允许子类获得的属性和行为一种途径; 继承是父类和子类之间的关系;面对象通过使用继承达到代码复用的目的; 通过继承子类可以获取父类的属性和行为;【由访问控制修饰符来限定】 java的继承是单继承方式,使用extends关键字实现;一个类只能有一个直接父类;【C++是多继承】【单继承是java简单性的一种体现】 java中的顶级父类是Object类;Object是java中的所有类的直接或间接父类; 访问控制修饰符符对继承的限定:【也是封装的体现】 public:可以被继承; protected:可以被继承; 默认的:能被同包的子类继承; private:不能继承; 1.7 多态 多态是父类和子类之间的一种关系;对于同名的行为子类展示或者扩展出来的与父类不同的行为状态; 多态可以从两个角度理解: 子类角度: 子类覆盖了从父类继承的同名的方法;好处;扩展的父类行为方法的功能,保证了子类功能的多样性; 也叫作重写(Override)【覆写】; 课下扩展作业:重写和重载异同点? 父类角度: 父类可以指代子类;父类类型的变量可以指向子类类型的实例变量;也叫作 塑型 【溯型】; 溯型分为向上溯型和向下溯型; 软件工程原则:面向父类的编程。【面向接口的编程】 扩展:使用Object类型可以指向所有类的实例变量; Object obj = new XXX();【Object可以指向java中所有的类型】 解析: 重写是子类同名的方法覆盖了父类同名的方法; 重写是父子类之间的关系;重载是一个类内容兄弟之间的关系; 父类类型指代子类实例变量是向上溯型;【默认转换】 父类类型强制转换为子类类型向下溯型;【强制转换】 注意:只有向上溯型的父类才能强制转换为子类【向下溯型】; 重写的方法可以使用@Override注解进行标注,也可以不适用,但是推荐使用;【使用了@Override之后ide工具会进行语法检测】 构造方法不构成重写,也就是构造方法没有多态; 如果使用父类指代子类实例变量的方式,使用父类类型的变量只能调用子类从父类继承的行为方法,而子类新扩展行为方法无法调用; 如果需要调用子类新扩展的方法行为,则需要使用向下溯型将父类重新转换为子类;【强制类型转换】 如果子类重写了父类的行为方法,在子类中如果想调用父类的被覆盖行为方法,则需要使用super.xxx()来调用; 类似成员变量和局部变量同名时使用this区分是一样的; 重写的构成条件: 父类和子类的方法名要相同; 父类和子类的方法的参数列表要相同; 子类的访问控制修饰符的范围要大于等于父类的访问控制修饰符的范围; 子类的返回值类型和父类方法的返回值类型一样或者可以兼容; 子类方法抛出的异常范围要小于等于父类方法抛出或者处理的异常范围; 1.8 this和super关键字的用法 this:指代当前类的实例对象; this. 表示当前类的;用于区分被同名局部变量覆盖成员变量; this(实参列表) 表示调用当前类的构造方法;【只能在第一行】 super:指代当前类的父类的实例对象; super. 表示当前类的父类的属性和行为;用于区分被子类同名方法重写的父类方法; super(实参列表) 表示调用当前类的父类的构造方法;【只能在第一行】 1.9 static关键字 表示静态的关键字;静态在jvm中是常驻内存的;静态的生命周期:从加载jvm开始到jvm运行结束为止; static可以修饰:类、方法、成员变量、语句块; 语句块:使用 {} 标识的代码块; 主要作用是改变作用域范围; static只能修饰成员变量不能修饰局部变量; static修饰的静态方法或者静态语句块只能调用静态的对象【静态成员变量、静态的方法】 非静态的方法可以调用静态的和非静态的对象;也就是非静态方法可以调用所有的; static修饰的成员变量和方法可以类名直接调用;所以静态的成员变量也叫作类变量; static修饰的语句块叫做静态语句块,静态语句块只执行一次;作用:用于类加载的一些初始化操作;有点类似于构造方法的初始化作用; 非静态语句块在类每次new时都会执行,并且是在构造方法之前执行的;静态语句块只执行一次; 1.10 final关键字 final关键字是终结的意思、最终的意思; final可以修饰类、方法、变量(成员变量和局部变量); final修饰类表示这个不能被继承;防止继承滥用的;例如 String 类; final修饰的方法表示这个方法不能够被子类重写; 防止通过重写修改父类来修改父类方法的逻辑; final修饰的变量表示这个变量的值一旦被初始化,则不允许再进行修改; 对于基本类型来说是一旦初始化之后,不允许在修改; 【值不能改】 对于对象类型来说是一旦分配内存空间之后,怎不允许修改引用地址;存储空间中的内容可以修改; 【地址的值不能改;地址的存储空间内容可以改】 static final 修饰的成员变量 叫做静态常量 ; 命名规则 字母全部大写用_分割; 静态常量要求声明时就要进行初始化; 1.11 abstract关键字 abstract是抽象的意思;当在类的抽象封装时当一些行为无法定义具体内容时,可以使用abstract进行规范定义,表示将来要是现实的行为(推迟到子类进行实现); abstract可以修饰类、方法; abstract修饰的类叫做抽象类;修饰的方法叫做抽象方法; 解析: 使用abstract修饰的类使抽象类; 含有抽象方法的类是抽象,抽象类不一定非要含有抽象方法; 抽象方法是之定义方法名而没有方法体;【方法定义时去掉 {} 就是抽象方法】 如果一个类继承了抽象类,则这个类要么将父类的抽象方法通过重写进行实现;要么这个子类继续作为一个抽象类存在; 抽象类和普通类区别在于使用abstract关键字进行修饰,或者是含有了抽象方法; 因为抽象类含有抽象的内容,所以不能使用 new 直接创建实例对象;【new 分配内存空间;abstract是没有实现的,无法分配内存;矛盾】 ////////////////////////////0318////////////以上是昨天笔记//////////////////////////////////////////////////////////////////// 1.12 interface关键字 接口是一组行为规范的定义; 接口是一种特殊的抽象类;特殊到需要使用interface重新定义; 解析: 接口需要使用interface进行定义; 接口中只有抽象方法,没有其他普通方法【jdk8-】;【考试以这个说法为准】 jdk8+?以后可以使用default关键字在接口中定义一个带方法体的普通方法,default方法也只能使用public修饰,public可以省略; 接口中定义的方法都是 public abstract 修饰的方法,其中 public abstract 关键字可以全部或者部分省略;【不能用其他的访问控制修饰符】 接口中定义的变量都是 public static final 修饰的变量【常量】,其中 public static final 可以全部或者部分省略;【不能用其他的访问控制修饰符】 接口和抽象类一样不能使用new直接创建; 如果子类实现【implements】接口则子类需要全部实现接口中的抽象方法; 接口的多继承: java中的接口是支持多继承的;目的,用于弥补java类只能单继承带来的局限性;java中多继承是通过接口实现的; 接口的多继承分为两种: 类多继承接口:一个类【class】可以继承多个接口;使用implements关键进行继承【实现】 接口多继承接口:一个接口可以继承多个接口;使用extends关键字进行继承; 1.13 Object工具类和String工具类 Object是java中顶级类;是所有类的直接或间接父类; Object中有几个需要子类进行实现的方法:【所有类都会包含这些方法】 hashCode() clone() equals() toString() wait() notify() 理解hashCode方法; 掌握equals方法; queals方法一般是用来判定两个对象的内容是否相同; == 操作符是判定的两个对象是否相等;【基本类型是值相等;对象类型是通过判定地址引用是否相同来判定相等,也就是判定是否为同一个存储地址】 == 和 equals的区别: == 判断两个变量的地址引用是否相同; 地址引用相同内容一定相同;反之,不一定; equals是用来判定内容是否相同; 在Object类中,equals方法使用的是 == 判定; 其他的子类必须对继承自Objcet类的equals方法进行重写;重写的目的是 让equals方法具有判断内容相等的功能;例如 String类,重写了equals方法; String 工具类: String适用于处理字符串的工具类;字符串本质上是一个字符的数组; 解析: String字符串一旦初始化之后,长度是不可以改变的; String字符串具有数组的特性,可以使用下标进行访问; 掌握字符串和字符之间的异同点; 掌握字符换工具类中常用的方法; 字符串的存储模型: 字符串可以使用字符串常量和new操作进行初始化赋值,所有字符串存储在:字符串池【栈结构】、内存堆中【堆结构】; jvm的栈存储和堆存储有区别: 栈结构存储的主要是以常量值、变量引用地址为主;且常量值不能够重复;【栈中存储的内容不能重复】; 堆中存储的内容需要使用new操作符进行内存分配;堆中的内容可以重复; 使用字符串常量形式赋值的字符串对象放在字符串池中,且字符串常量值不能重复; 使用new操作给字符串赋值的放在内存堆中,堆中的字符串内容可以重复; 使用 == 判定是否为同一个内存地址。 1.14 包装类 包装类是java为了把8种基本类型纳入面向对象的知识体系结构,而采用面向对象的方式对8中基本类型进行的封装; 8种基本类型: byte short int long char float double boolean 8种包装类类型:Byte Short Integer Long Character Float Double Boolean 解析: 基本类型和包装类类型默认值不一样;所有的包装类类型默认值都是 null ; 包装类类型支持OOP所有的特性; 软件工程原则: 在类的封装过程中,成员变量的类型一般要使用包装类类型;而不要使用基本类型; 包装类类型存在的价值: 有些语法要求必须使用对象类型时,基本类型无法满足要去,所以要使用包装类类型; 泛型、集合、synchronized关键字等必须使用对象类型; 基本类型通过包装类类型与OOP有机结合在一起; 1.15 内部类 内部类:定义在类内部的类就是内部类;根据内部类定义ide位置,一般将其分为4中:成员内部类、局部内部类、静态内部类、匿名内部类 成员内部类: 定义在成员变量位置上的内部类就是成员内部类; 成员内部类和成员变量具有一样性质和用法;他们的生命周期、作用与范围、用法都一样; 静态内部类: ★★★ 使用static修饰的成员内部类就是静态内部类; 静态内部类和静态成员变量一样的性质和用法;他们的生命周期、作用与范围、用法都一样; 局部内部类: 定义在局部变量位置上的内部类就是局部内部类; 局部内部类和局部变量具有一样性质和用法;他们的生命周期、作用与范围、用法都一样; 匿名内部类: ★★★ 没有变量名的局部内部类就是匿名内部类;也是定义在局部变量位置上的内部类; 匿名内部类和匿名局部变量具有一样性质和用法;他们的生命周期、作用与范围、用法都一样; 匿名内部类一般用于使用new现场创建一个抽象类、接口的匿名实例对象;一般需要在 {} 中现场实现抽象的方法,这个方法就是处理业务逻辑的部分; ``` 1. xxxx 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. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)