曹阳的博客 仅用于学习和分享

Java核心类库1

2019-10-25

核心类库D1:Java中常用的包、Object类、包装类和数学处理类

1.Java中常用的包

1.1 java.lang(不用导包)

  1. 该包是Java语言的核心包,该包中的内容由Java虚拟机自动导入
  2. 如:String类、System类等
  3. 为以后的学习的包做铺垫的

1.2 Java.util

  1. 该包是Java语言的工具包,该包中提供大量工具类和集合类
  2. 如:SCanner类、Random类
  3. 里面有大量的集合类,学完集合类各种管理系统就可以写了

1.3 java.io

  1. 该包是Java语言的输入输出包,该包中提供读取文件的类
  2. 如:FileInputStream类、FileOutputStream类
  3. 学完可以对硬盘上的文件进行读取

1.4 java.net

  1. 该包是Java语言的网络包,该包中提供大量网络编程类
  2. 如:ServerSocket类、Socket类等
  3. 可以写个QQ

1.5 java.sql

是操作数据库的所有类和接口

2.Object类(重点)

2.1 基本概念

java.lang.Object类是类层次结构的根类,任何类都是该类的直接或间接子类。

2.2 常用的方法

  1. Object() - 使用无参的方式构造对象。
    • 当一个类没有指定父类时,它的父类默认是Object()
    • super()表示调用父类的无参构造方法,没有父类时就是调用Object类的无参构造方法
  2. boolean equals(Object obj) - 用于判断调用对象是否与参数对象相等。
    • 该方法默认比较两个对象的地址,与 == 运算符的结果一致。
    • 当Student类中没有equals方法时,调用从objects类中继承的版本;当Student类中重写equals方法后,调用重写后的版本,比较内容
    • 若希望该方法比较两个对象的内容(学号),则需要重写该方法。(this表示调用对象)
      1. 若调用对象和参数对象的地址相同,则内容一定相同
      2. 若调用对象不为空参数对象为空,则内容一定不相同
      3. 若参数对象的类型和调用对象相同,则比较里面的学号是否相等(父类类型的引用不能直接访问子类类型的方法,若想访问需强制类型转换)
      4. 若参数对象和调用对象的类型不同,则内容一定不相同
    • 参数类型是Object类,就是可以传递任意类型的参数,多态的使用场合之一
    • equals方法在非空对象引用上实现相等关系,否则空指针异常
  3. int hashCode() - 用于获取调用对象的哈希码值(内存地址的编号)。
    • 若两个对象调用equals方法的结果相等,则各自调用hashCode方法的结果相同
    • 若两个对象调用equals方法的结果不相等,则各自调用该方法的结果不相同(可以相同)。
    • 因此上述两个方法中只要 有一个重写,则另外一个也要重写。
    • 为了使得该方法的结果与equals方法保持一致,因此重写该方法。
    • 当Student类中没有重写hashCode方法时,调用从Object类继承的版本
    • 重写之后,getId()不再代表内存地址的编号
  4. String toString() - 用于获取调用对象的字符串形式。
    • 该方法默认返回的字符串为:包名.类名@哈希码的十六进制形式。
    • 为了使得该方法返回更有意义的字符串内容,需要重写该方法。
    • 使用print()/println()打印引用或字符串连接引用时,会自动调用该方法
    • 当Student类中没有重写toString方法时,调用从Object类中继承的版本

2.3 练习:

  1. 编程实现Student类的封装,特征:学号和姓名。
  2. 编程实现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 包装类的分类

  1. int => java.lang.Integer类
  2. char => java.lang.Character类
  3. 8种基本数据类型,8种包装类,其它类型对应的包装类都是将首字母变大写。

3.3 Integer类

  1. 基本概念
    java.lang.Integer类里面提供了一个int类型的成员变量用于包装int类型。
    该类由final关键字修饰表示不能被继承。

  2. 常用的方法
    • 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; // 自动拆箱  
      
  3. 自动装箱池:在Integer类的内部提供了自动装箱池技术,将-128到127之间的整数已经装箱完毕,当程序中使用该范围之间的整数时,无需装箱直接取用自动装箱池中的对象即可,从而提高效率

3.4 BigDecimal类(math包里的)

  1. 基本概念
    由于float类型和double类型运算会有误差,若需要实现精确运算则借助java.math.BigDecimal加以描述。

  2. 常用的方法
    BigDecimal(String val) - 根据参数指定的字符串来构造对象。
    BigDecimal add(BigDecimal augend) - 用于实现加法运算。
    BigDecimal subtract(BigDecimal subtrahend) - 用于实现减法运算。
    BigDecimal multiply(BigDecimal multiplicand) - 用于实现乘法运算。
    BigDecimal divide(BigDecimal divisor) - 用于实现除法运算。

3.5 BigInteger类(java.math)

  1. 基本概念
    若希望表示比long类型范围还大的整数数据,则需要借助java.math.BigInteger类型描
  2. 常用的方法
    • 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):用于实现调用对象和参数对象的商和余数并返回的功能

作业:

  1. 重点掌握Student.java文件的代码。
  2. 自定义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

扩展面试题

  1. 下面的代码中创建了几个对象并分别放在什么位置?
     String s1 = "Hello";  //1个对象,常量池
     String s1 = new String("Hello");  //2个对象,1个在常量池,1个在堆区
    
  2. 分析以下代码的执行流程并写出执行结果
     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
    

下一篇 Java核心类库2

Content