前言:在Java SE中提供了众多丰富类和接口,其中很多类前面已经使用过了,如String、StringBuiler和StringBuffer等。由于数量众多,本章不再一一介绍。本章归纳了Java中一些在日常开发过程中常用的类介绍一下,至于其他的不常用类读者可以自己查询Java SE API文档。
因为我个人原因,后续将减少发有关java的文章,将转接到C#语言
1 Java根类——Object
第一个应该介绍的常用类就是java.lang.Object类,它是Java所有类的根类,Java所有类都直接或间接继承自Object类,它是所有类的“祖先”。Object类属于java.lang包中的类型,不需要显示使用import语句引入,它是由解释器自动引入。
Object类有很多方法,常用的几个方法:
String toString():返回该对象的字符串表示。
boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
这些方法都是需要在子类中用来覆盖的,下面就详细解释一下它们的用法。
1.1 toString()方法
为了日志输出等处理方便,所有的对象都可以以文本方式表示,需要在该对象所在类中覆盖toString()方法。如果没有覆盖toString()方法,默认的字符串是“类名@对象的十六进制哈希码 ”。
哈希码(hashCode),每个Java对象都有哈希码(hashCode)属性,哈希码可以用来标识对象,提高对象在集合操作中的执行效率。
下面看一个示例,在前面章节介绍过Person类,它的代码如下:
上述代码第①行覆盖toString()方法,返回什么样的字符串完全是自定义的,只要是能够表示当前类和当前对象即可,本例是将Person成员变量拼接成为一个字符串。
调用代码如下:输出结果如下:
使用System.out.println等输出语句可以自动调用对象的toString()方法将对象转换为字符串输出。读者可以测试一下,如果Person中没有覆盖toString()方法会是什么样子?它会输出类似如下的字符串:
com.a51work6.Person@15db9742
1.2 对象比较方法
在前面学习字符串比较的时,曾经介绍过有两种比较方法:==运算符和equals()方法,==运算符是比较 两个引用变量是否指向同一个实例,equals()方法是比较两个对象的内容是否相等,通常字符串的比较,只是关心的内容是否相等。
事实上equals()方法是继承自Object的,所有对象都可以通过equals()方法比较,问题是比较的规则是什么,例如两个人(Person对象)相等是指什么?是名字?是年龄?问题的关键是需要指定相等的规则,就是要指定比较的是哪些属性相等,所以为了比较两个Person对象相等,则需要覆盖equals()方法,在该方法中指定比较规则。
修改Person代码如下:上述代码第①行覆盖了equals(),为了防止传入的参数对象不是Person类型,则需要使用instance of运算符判断一下,见代码第②行。如果是Person类型,通过代码第③行强制类型转换为Person。代码第④行进行比较,把年龄作为比较是否相等的规则,不管其他属性只要是年龄相等,则认为两个Person对象相等。
调用代码如下:从上述代码中创建了两个Person对象,它们具有相关的年龄,这两个Person对象使用==比较结果是false,因为它们是两个不同的对象。使用equals()方法比较结果是true。
2 包装类
在Java中8种基本数据类型不属于类,不具备“对象”的特征,没有成员变量和方法,不方便进行面向对象的操作。为此,Java提供包装类(Wrapper Class)来将基本数据类型包装成类,每个Java基本数据类型在java. Lang包中都有一个相应的包装类,每个包装类对象封装一个基本数据类型数值。对应关系如下表所示,除int和char类型外,其他的类型对应规则就是第一个字母大写。
基本数据类型与包装类对应关系表:包装类都是final的,不能被继承。包装类都是不可变类,类似于String类,一旦创建了对象,其内容就不可以修改。包装类还可以分成三种不同类别:数值包装类(Byte、Short、Integer、Long、Float和 Double)、Character和Boolean。下面分别详细介绍一下。
2.1 数值包装类
这些数值包装类(Byte、Short、Integer、Long、Float和Double)都有一些相同特点。
- 构造方法类似
每一个数值包装类都有两个构造方法,以Integer为例,Integer构造方法如下:
Integer(int value):通过指定一个数值构造Integer对象。
Integer(String s):通过指定一个字符串s构造对象,s是十进制字符串表示的数值。
- 共同的父
类这6个数值包装类有一个共同的父类——Number,Number是一个抽象类,除了这6个子类还有AtomicInteger、AtomicLong、BigDecimal和BigInteger,其中BigDecimal和BigInteger后面还会详细介绍。Number是抽象类,要求它的子类必须实现如下6个方法:
byte byteValue():将当前包装的对象转换为byte类型的数值。
double doubleValue():将当前包装的对象转换为double类型的数值。
float floatValue():将当前包装的对象转换为float类型的数值。
int intValue():将当前包装的对象转换为int类型的数值。
long longValue():将当前包装的对象转换为long类型的数值。
short shortValue():将当前包装的对象转换为short类型的数值。
通过这6个方法数值包装类可以互相转换这6种数值,但是需要注意的是大范围数值转换为小范围的数值,如果数值本身很大,可以会导致精度的丢失。
- compareTo()方法
每一个数值包装类都有int compareTo(数值包装类对象)方法,可以进行包装对象的比较。方法返 回值是int,如果返回值是0,则相等;如果返回值小于0,则此对象小于参数对象;如果返回值 大于0,则此对象大于参数对象。
04. 字符串转换为基本数据类型
每一个数值包装类都提供一些静态parseXXX()方法将字符串转换为对应的基本数据类型,以Integer为例,方法定义如下:
static int parseInt(String s):将字符串s转换有符号的十进制整数。
static int parseInt(String s, int radix):将字符串s转换有符号的整数,radix是指定基数,基数用来指定进制。注意这种指定基数的方法在浮点数包装类(Double和Float)中没有的。
05. 基本数据类型转换为字符串
每一个数值包装类都提供一些静态toString()方法实现将基本数据类型数值转换为字符串,以 Integer为例,方法定义如下:
static String toString(int i):将该整数i转换为有符号的十进制表示的字符串。
static String toString(int i, int radix):将该整数i转换为有符号的特定进制表示的字符串,radix是基数可以指定进制。注意这种指定基数的方法在浮点数包装类(Double和Float)中没有的。
示例代码如下
2.2 Character类
Character类是char类型的包装类。Character类常用方法如下:
Character(char value):构造方法,通过char值创建一个新的Character对象。
char charValue():返回此Character对象的值。
int compareTo(Character anotherCharacter):方法返回值是int,如果返回值是0,则相等;如果返回值小于0,则此对象小于参数对象;如果返回值大于0,则此对象大于参数对象。
示例代码如下:
2.3 Boolean类
Boolean类是boolean类型的包装类。
01. 构造方法
Boolean类有两个构造方法,构造方法定义如下:
Boolean(boolean value):通过一个boolean值创建Boolean对象。
Boolean(String s):通过字符串创建Boolean对象。s不能为null,s如果是忽略大小
写"true"则转换为true对象,其他字符串都转换为false对象。
02. compareTo()方法
Boolean类有int compareTo(Boolean包装类对象)方法,可以进行包装对象的比较。方法返回值是int,如果返回值是0,则相等;如果返回值小于0,则此对象小于参数对象;如果返回值大于0,则此对象大于参数对象。
03. 字符串转换为boolean类型
Boolean包装类都提供静态parseBoolean ()方法实现将字符串转换为对应的boolean类型,方法定义如下:
static boolean parseBoolean(String s):将字符串转换为对应的boolean类。s不能为null,s如果是忽略大小写"true"则转换为true,其他字符串都转换为false。
示例代码如下:
本文献到此结束,下章节将继续讲Math类,大数值, 日期时间相关类和Java 8新日期时间相关类。