• 面向对象(下)


    面向对象(下)

    一、包装类

    1.1、基本类型和引用类型

    ![基本数据类型和包装类对应表](C:UsersAdministratorDesktopoop基本数据类型和包装类对应表。jpg)1、一切皆对象,但是八大基本类型却不是对象。
    2、声明方式不同,引用数据类型需要用new关键字来创建,基本数据类型不需要。
    3、存储位置不同,基本数据类型直接存储保存在堆栈中,能高效存取,引用数据类型需要引用指向实例,具体的实列保存在堆中。
    4、引用数据类型的初始值为null,基本数据类型的初始值依其数据类型而定。

    1.2、包装类型的作用

    包装类型是为了方便对基本数据类型进行操作,解决了一些基本数据类型解决不了的问题:

    • 集合中不允许存放基本数据类型,只能存放引用类型。
    • 基本类型和引用类型可以进行相互转换,自动拆箱和装箱。
    • 通过包装类型的parse方法可以实现基本数据类型+String类型之间的相互转换。
    • 方法中的参数为Object类型,传入基本数据类型就不行。需要对基本数据类型进行装箱。

    1.3、 装箱和拆箱

    JDK1.5以前(已经过时)
    把基本类型转换成包装类型需要通过包装类。valueOf(基本类型的值)方法。
    把包装类型转换成基本类型需要通过包装类。xxxValue()方法。
    JDK1.5后提供了自动装箱和拆箱
    可以把基本类型的变量“近似”地当成对象使用。转换由系统完成。
    包装类实现基本类型和字符串的转换

    • 字符串转成基本类型
    • 包装类。parseXxx(String)静态方法(除Character之外的所有包装类都提供了该方法。)- 包装类。valueOf(String s)静态方法
    • 基本类型转成字符串
    • String类也提供了多个重载valueOf()方法,用于将基本类型变量转换成字符串```
      String.valueO(基本类型);
    - 基本类型+“  ”;直接转换成字符串
    Java 7增强了包装类的功能,
    - 提供了一个静态的compare(xxx val1,xxx val2)方法来比较基本类型值的大小。
    - 为Character包装类增加了大量的工具方法来对一个字符进行判断java 8 支持无符号算术运算。
    ## 二、 处理对象
    ### 2.1、 toString
    一个“自我描述”的方法。
    ### 2.2、==和equals方法
    常量池(constant pool)专门用于管理在**编译时**被确定并被保存在已编译的。class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量。(在编译期间能够确定的就放在常量池中。运行期间的不放在常量池中)Object类的equals()方法比较的结果与==运算符比较的结果完全相同。==和equals方法本质上都是指向地址,只不过equals()方法被重写了,才比较的是值。
    如何正确地重写equals()方法:
    ? 自反性:对任意x, x.equals(x)一定返回true。
    ? 对称性:对任意x和y, 如果y.equals(x)返回true,则x.equals(y)也返回true。
    ? 传递性:对任意x, y, z, 如果x.equals(y)返回ture,y.equals(z)返回true,则x.equals(z)一定返回true。
    ? 一致性:对任意x和y, 如果对象中用于等价比较的信息没有改变, 那么无论调用x.equals(y)多少次,返回的结果应该保持一致,要么一直是true,要么一直是false。
    ? 对任何不是null的x, x.equals(null)一定返回false。
    ## 三、static关键字
    以static修饰的成员就是类成员,类成员随着类的加载而加载,随着成员的消亡而消亡。调用格式是:类名。类成员**static 关键字主要有以下四种使用场景**
    1、修饰成员变量和成员方法
    2、静态代码块
    3、修饰类(只能修饰内部类)
    4、静态导包(用来导入类中的静态资源,1.5之后的新特性)## 四、final关键字
    final关键字可用于修饰类、变量和方法,用于表示它修饰的类、方法和变量不可改变。一旦定义就不能更改final修饰的成员变量必须由程序员显式地指定初始值### 4.1、final修饰的变量
    - 类变量:必须在**静态初始化块**中指定初始值或**声明该类变量时指定初始值**,而且只能在两个地方的其中之一指定。
    - 实例变量:必须在**非静态初始化块**、**声明该实例变量**或**构造器中指定初始值**,而且只能在三个地方的其中之一指定。
    - Java不允许在final成员变量显式初始化之前,直接访问final修饰的age成员变量,但可以通过方法来访问(这是一个缺陷,应该避免)- final修饰的引用变量final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但可以改变这个对象和对象里面的值。
    ### 4.2、final修饰的方法
    final修饰的方法不可被重写,
    ### 4.3、final修饰的类
    不可以有子类
    ### 4.5、不可变类
    不可变(immutable)类的意思是创建该类的实例后,该实例的实例变量是不可改变的。Java提供的8个包装类和java.lang.String类都是不可变类,当创建它们的实例后,其实例的实例变量不可改变。
    - 如何设计一个不可变类
    1. 使用private和final修饰符来修饰该类的成员变量。
    2. 提供带参数的构造器(或返回该实例的类方法),用于根据传入参数来初始化类里的成员变量。
    3. 仅为该类的成员变量提供getter方法,不要为该类的成员变量提供setter方法,因为普通方法无法修改final修饰的成员变量。
    4. 确保类中的方法不会被重写
    5. 如果有必要,重写Object类的hashCode()和equals()方法## 五、抽象和接口
    ### 5.1抽象方法和抽象类
    抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。
    规则:
    - 必须使用abstact关键字来定义,抽象方法不能有方法体。
    - 抽象类不能被实例化
    -  抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举)5种成分。主要作用是被子类调用- 包含抽象方法的类只能被定义成抽象类
    注意:
    ?abstract不能用于修饰成员变量,不能用于修饰局部变量不能用于修饰构造器,没有抽象构造器,抽象类里定义的构造器只能是普通构造器。
    ?abstract关键字修饰的方法必须被其子类重写才有意义。不能被定义为private访问权限。
    ### 5.2、接口
    Java 9:允许在接口中定义默认方法和类方法,默认方法和类方法都可以提供方法实现,Java 9为接口增加了一种私有方法,私有方法也可提供方法实现。
    ![接口的定义](C:UsersAdministratorDesktopoop接口的定义。jpg)修饰符可以是public或者省略,命名规范和类名相同的命名规则。接口只能继承接口,不能继承类。
    注意:接口内默认都采用public static 两个修饰符。接口支持多继承,Java类支持单继承多实现1. 接口的用途
    - 定义变量,也可以进行强制类型转换
    - 调用接口中定义的常量。
    - 被其他类实现。
    2.接口和抽象类用法差别
    - 接口里只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
    - 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
    - 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
    - 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
    -  一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。
    ###六、内部类
  • 相关阅读:
    求一个数的阶乘在 m 进制下末尾 0 的个数
    区间dp
    最长公共子序列变形
    学习stm32专区
    C/C++中static关键字详解
    ASP.NET调用Office Com组件权限设置
    TreeView控件
    SQL笔记(1)索引/触发器
    NPOI 1.2.5 教程
    SQL Povit
  • 原文地址:https://www.cnblogs.com/Q-Seekers/p/12992528.html
Copyright © 2020-2023  润新知