核心类库D1:Java中常用的包、Object类、包装类和数学处理类
1.Java中常用的包
1.1 java.lang(不用导包)
- 该包是Java语言的核心包,该包中的内容由Java虚拟机自动导入
- 如:String类、System类等
- 为以后的学习的包做铺垫的
1.2 Java.util
- 该包是Java语言的工具包,该包中提供大量工具类和集合类
- 如:SCanner类、Random类
- 里面有大量的集合类,学完集合类各种管理系统就可以写了
1.3 java.io
- 该包是Java语言的输入输出包,该包中提供读取文件的类
- 如:FileInputStream类、FileOutputStream类
- 学完可以对硬盘上的文件进行读取
1.4 java.net
- 该包是Java语言的网络包,该包中提供大量网络编程类
- 如:ServerSocket类、Socket类等
- 可以写个QQ
1.5 java.sql
是操作数据库的所有类和接口
2.Object类(重点)
2.1 基本概念
java.lang.Object类是类层次结构的根类,任何类都是该类的直接或间接子类。
2.2 常用的方法
- Object() - 使用无参的方式构造对象。
- 当一个类没有指定父类时,它的父类默认是Object()
- super()表示调用父类的无参构造方法,没有父类时就是调用Object类的无参构造方法
- boolean equals(Object obj) - 用于判断调用对象是否与参数对象相等。
- 该方法默认比较两个对象的
地址
,与 == 运算符的结果一致。 - 当Student类中没有equals方法时,调用从objects类中继承的版本;当Student类中重写equals方法后,调用重写后的版本,比较内容
- 若希望该方法比较两个对象的内容(学号),则需要重写该方法。(this表示调用对象)
- 若调用对象和参数对象的地址相同,则内容一定相同
- 若调用对象不为空参数对象为空,则内容一定不相同
- 若参数对象的类型和调用对象相同,则比较里面的学号是否相等(父类类型的引用不能直接访问子类类型的方法,若想访问需强制类型转换)
- 若参数对象和调用对象的类型不同,则内容一定不相同
- 参数类型是Object类,就是可以传递任意类型的参数,多态的使用场合之一
- equals方法在非空对象引用上实现相等关系,否则空指针异常
- 该方法默认比较两个对象的
- int hashCode() - 用于获取调用对象的哈希码值(内存地址的编号)。
- 若两个对象调用equals方法的结果相等,则各自调用hashCode方法的结果相同
- 若两个对象调用equals方法的结果不相等,则各自调用该方法的结果不相同(可以相同)。
- 因此上述两个方法中只要 有一个重写,则另外一个也要重写。
- 为了使得该方法的结果与equals方法保持一致,因此重写该方法。
- 当Student类中没有重写hashCode方法时,调用从Object类继承的版本
- 重写之后,getId()不再代表内存地址的编号
- String toString() - 用于获取调用对象的字符串形式。
- 该方法默认返回的字符串为:包名.类名@哈希码的十六进制形式。
- 为了使得该方法返回更有意义的字符串内容,需要重写该方法。
- 使用print()/println()打印引用或字符串连接引用时,会自动调用该方法
- 当Student类中没有重写toString方法时,调用从Object类中继承的版本
2.3 练习:
- 编程实现Student类的封装,特征:学号和姓名。
- 编程实现StudentTest类对Student类进行测试,使用有参方式创建两个对象。
3.包装类和数学处理类(会用即可)
如:
int num = 5;
Person p = new Person();
Java语言是一门纯面向对象的编程语言 -> 把num类型的变量变成对象:
public class MyInteger {
private int num = 5;
}
MyInteger mi = new MyInteger();
3.1 包装类的概念
在某些特殊场合(集合)中要求所有的数据内容都必须是对象,而基本数据类型声明的变量并不满足该要求,此时就需要对变量进行对象化处理打包成对象,该机制需要使用包装类。
3.2 包装类的分类
- int => java.lang.Integer类
- char => java.lang.Character类
- 8种基本数据类型,8种包装类,其它类型对应的包装类都是将首字母变大写。
3.3 Integer类
-
基本概念
java.lang.Integer类里面提供了一个int类型的成员变量用于包装int类型。
该类由final关键字修饰表示不能被继承。 - 常用的方法
- Integer(int value) - 根据参数指定的整数来构造对象。
- Integer(String s) - 根据参数指定的字符串(必须是数字类型字符串)来构造对象。
- 该类重写了equals()、hashCode()以及toString()方法
- int intValue() - 用于获取调用对象中的int数值并返回。(实现了从Integer类型到int类型的转换,叫做拆箱)
- static Integer valueOf(int i) - 根据参数指定的整数值得到Integer类型的对象(实现了从int类型到Integer类型的转换,叫做装箱)
- static int parseInt(String s) - 将字符串类型转换为int类型并返回(实现了从String类型到int类型的转换)。
- 从jdk1.5开始增加新特性:自动装箱 和 自动拆箱
int ic = 30; Integer it4 = ic; // 自动装箱 int id = it4; // 自动拆箱
- 自动装箱池:在Integer类的内部提供了自动装箱池技术,将-128到127之间的整数已经装箱完毕,当程序中使用该范围之间的整数时,无需装箱直接取用自动装箱池中的对象即可,从而提高效率
3.4 BigDecimal类(math包里的)
-
基本概念
由于float类型和double类型运算会有误差,若需要实现精确运算
则借助java.math.BigDecimal加以描述。 -
常用的方法
BigDecimal(String val) - 根据参数指定的字符串来构造对象。
BigDecimal add(BigDecimal augend) - 用于实现加法运算。
BigDecimal subtract(BigDecimal subtrahend) - 用于实现减法运算。
BigDecimal multiply(BigDecimal multiplicand) - 用于实现乘法运算。
BigDecimal divide(BigDecimal divisor) - 用于实现除法运算。
3.5 BigInteger类(java.math)
- 基本概念
若希望表示比long类型范围还大的整数数据,则需要借助java.math.BigInteger类型描 - 常用的方法
- BigInteger(String val):根据参数指定的字符串来构造对象。
- BigInteger add(BigInteger val):用于实现加法运算。
- BigInteger subtract(BigInteger val):用于实现减法运算。
- BigInteger multiply(BigInteger val):用于实现乘法运算。
- BigInteger divide(BigInteger val):用于实现除法运算。
- BigInteger remainder(BigInteger val):用于实现调用对象和参数对象的余数并返回的功能
- BigInteger[] divideAndRemainder(BigInteger val):用于实现调用对象和参数对象的商和余数并返回的功能
作业:
- 重点掌握Student.java文件的代码。
- 自定义Person类实现封装,特征有:姓名和年龄,要求以姓名为基准重写equals方法、hashCode方法以及toString方法。
从Object类中继承下来的equals方法只能比较两个对象的地址 ,为了比较两个对象的内容,因此重写equals方法 注意:若参数对象的类型和调用对象的类型相同时,比较姓名是否相同if(obj instanceof Person) { // 对于基本数据类型来说,变量的数值就是数据内容 ==比内容 // 对于引用数据类型来说,变量的数值就是对象的地址 ==比地址 // return this.getName() == ((Person)obj).getName(); return this.getName().equals(((Person)obj).getName()); }
为了使该方法的结果与equals方法的结果保持一致,因此重写hashCode方法 String类里重写了equals方法,也必然重写了hashCode方法,
@Override public int hashCode() { int type = 12; return type*31 + getName().hashCode(); }
右键可以直接生成
Generate hashCode() and equals
扩展面试题
- 下面的代码中创建了几个对象并分别放在什么位置?
String s1 = "Hello"; //1个对象,常量池 String s1 = new String("Hello"); //2个对象,1个在常量池,1个在堆区
- 分析以下代码的执行流程并写出执行结果
String s1 = "hello"; //常量池 String s2 = "hello"; //常量池 String s3 = new String("hello"); //堆区 String s4 = new String("hello"); //堆区 System.out.println(s1.equals(s2)); //内容 true System.out.println(s1 == s2); //地址 true System.out.println(s3.equals(s4)); //内容 true System.out.println(s3 == s4); //地址 false System.out.println(s2.equals(s3)); //内容 true System.out.println(s2 == s3); //地址 false