(1)Object类 (2)包装类和数学处理类 (3)String类
1.Object类
1.1 常用的包
java.lang包 - 该包是Java语言中的核心包,该包中的内容由Java虚拟机自动导入
- 如:String类、System类等
java.util包 - 该包是Java语言中的工具包,里面包含了大量的工具类和集合类等
- 如:Scanner类、Random类等
java.io包 - 该包是Java语言中的输入输出包,里面包含了大量读写文件的类等
- 如:FileOutputStream类、FileInputStream类等
java.net包 - 该包是Java语言中的网络包,里面包含了大量网络编程的类等
- 如:ServerSocket类、Socket类等
… …
1.2 Object类
(1)基本概念
java.lang.Object类是所有类层次结构的根类,任何类都是该类的直接或间接子类。
(2)常用的方法(重点)
Object() - 使用无参方式构造对象。
boolean equals(Object obj) - 用于判断调用对象是否与参数对象相等。
- 该方法默认比较两个对象的地址,与 == 运算符结果相同。
- 为了使得该方法比较两个对象的内容,则需要重写该方法。
- 若该方法重写后,则应该重写hashCode方法来维护hashCode方法的常规协定
int hashCode() - 用于获取调用对象的哈希码值(内存地址的编号)。
- 若调用equals方法的结果相等,则各自调用hashCode方法的结果相同。
- 若调用equals方法的结果不相等,则各自调用hashCode方法的结果不相同。
- 为了维护上述的常规协定与equals方法结果保持一致,就需要重写该方法
String toString() - 用于获取对象的字符串形式。
- 该方法默认返回的字符串为:包名.类名@哈希码值的十六进制形式
- 为了返回更有意义的数据内容则需要重写该方法
- 当字符串内容与引用进行连接时,自动调用toString方法
- 当使用print或println方法打印引用时,会自动调用toString方法
equals方法重写的优化处理
if (this==obj)return true;
if (null==obj)return false;
if (obj instanceof Student){
return this.getID()==((Student) obj).getID();
}
return false;
hashCode方法重写:
//为了和equals方法保持一致,因此要重写该方法
@Override
public int hashCode(){
//return getID()
int type=12;
return type*31+getID();
}
String方法的重写:
//为了返回更有意义的数据内容因此冲重写该方法
@Override
public String toString(){
return "Student【name:"+getName()+",ID :"+getID()+"]";
}
练习:
编程实现Student类的封装,特征有:学号和姓名,要求提供打印所有特征的行为。
编程实现StudentTest类,在main方法中使用有参方式创建对象并打印特征。
Student类:
package FIFI;
// 1. 编程实现Student类的封装,特征有:学号和姓名,要求提供打印所有特征的行为。
public class Student {
private int ID;
private String Name;
public Student(int ID,String Name) {
setID(ID);
setName(Name);
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public void show(){
System.out.println("学号:"+getID()+","+"姓名:"+getName());
}
//重写toString方法,代替show方法
@Override
public String toString(){
return "Student【name:"+getName()+",ID :"+getID()+"]";
}
//重写equals方法
@Override
public boolean equals(Object obj){
if (null==obj) return false;
if (this==obj) return true;
if (obj instanceof Student){
return this.getID()==((Student) obj).getID();
}
return false;
}
//重写hashCode方法
@Override
public int hashCode(){
int type=12;
return type*31+getID();
}
}
StudentTest 类:
package FIFI;
//2. 编程实现StudentTest类,在main方法中使用有参方式创建对象并打印特征
public class StudentTest {
public static void main(String[] args) {
Student tt=new Student(1212,"shimmer");
Student tt2=new Student(1212,"shimmer");
tt.show();
System.out.println();
Student zz=new Student(1213,"Rechetly祝祝");
// 重写toString方法
String Str=zz.toString();
System.out.println("Str="+Str);
boolean st=tt.equals(zz);
boolean st1=tt.equals(tt2);
System.out.println("st="+st);
System.out.println("st1="+st1);
int ia=tt.hashCode();
int id=tt2.hashCode();
System.out.println("ia的哈希值:"+ia);
System.out.println("id的哈希值:"+id);
}
}
结果:
2.包装类和数学处理类(会用即可)
如:
Person p = new Person(); - 声明Person类型的引用指向Person类型的对象
int num = 10; - 声明一个int类型的变量num初始值为10
Java语言是一门纯面向对象的编程语言
public class MyInteger {
private int num = 10;
}
MyInteger it = new MyInteger();
2.1 包装类的概念
由于Java语言是一门纯面向对象编程语言,而8种基本数据类型声明的变量并不是对象,为了满足Java语言的特性就需要对这些变量进行对象化处理,而实现该功能的相关类就叫做包装类。
2.2 包装类的分类
int => java.lang.Integer类
char => java.lang.Character类
其它类型对应的包装类就是将首字母变成大写
2.3 Integer类
(1)基本概念
java.lang.Integer类是int类型的包装类,里面包含了一个int类型的成员变量。
该类由final关键字修饰表示不能被继承。
(2)常用的方法
Integer(int value) - 根据参数指定的整数构造对象
Integer(String s) - 根据参数指定的字符串构造对象
该类重写了equals()、hashCode()、toString()方法
int intValue() - 用于获取调用对象中的整数数据并返回。
static Integer valueOf(int i) - 根据参数指定的整数返回对应的Integer对象。
static int parseInt(String s) - 用于将String类型转换为int类型并返回。
package Three;
public class IntegerTest {
public static void main(String[] args) {
// 1.构造Integer类型的对象并打印
Integer it1=new Integer(100);//整数类型:
// 自动调用toString方法得到String类型的返回值
System.out.println("a=" + it1);
Integer it2=new Integer("20");//字符串类型
System.out.println("it2="+it2);
System.out.println("-----------------------");
// 2.调用成员方法进行测试
// 相当于实现了从Integer类型到int类型的转换,叫做拆箱
int res =it2.intValue();
System.out.println("拆箱:"+res);
// 相当于实现了从int类型到Integer类型的转换,叫做装箱
Integer it3=Integer.valueOf(res);
System.out.println("装箱后:"+it3);
// 相当于实现了从String类型到int类型的转换
res=Integer.parseInt("12345");
System.out.println("转换的整数数据类型是:"+res);
// 相当于实现从int类型到String类型的转换
// String str1 = String.valueOf(res);
String str1=""+res;
System.out.println("转换的字符数据类型是:"+str1);
System.out.println("-----------------------------");
// 从jdk1.5开始增加了新特性:自动装箱和自动拆箱
Integer it4=10;
res=it4;
}
}
相当于实现了从Integer类型到int类型的转换,叫做拆箱
相当于实现了从int类型到Integer类型的转换,叫做装箱
2.4 BigDecimal类
(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)
- 用于计算调用对象和参数对象的商并返回。
package Three;
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args) {
// 1.构造BigDecimal类型的对象
BigDecimal db1=new BigDecimal("13.0" );
BigDecimal db2=new BigDecimal("6.5" );
//2.实现上述对象的加减乘除操作并打印
System.out.println("计算的和是:"+db1.add(db2));//19.5
System.out.println("计算的差是:"+db1.subtract(db2));//6.5
System.out.println("计算的积是:"+db1.multiply(db2));//84.50
System.out.println("计算的商是:"+db1.divide(db2));//2
System.out.println("---------------------------");
// 3.测试一下是否可以实现精确运算
System.out.println(0.1+0.2);//0.30000000000000004
BigDecimal bd3 = new BigDecimal("0.1");
BigDecimal bd4 = new BigDecimal("0.2");
System.out.println("计算的精确结果是:" + bd3.add(bd4)); //0.3
// 4.若商无法精确时的处理方法
BigDecimal ii=new BigDecimal("1.0");
BigDecimal uu=new BigDecimal("2.0");
System.out.println(ii.divide(uu,BigDecimal.ROUND_HALF_UP));//0.5
}
}
**3.String类(重中之重)
3.1 基本概念**
java.lang.String类用于描述字符串,Java应用程序中所有字符串字面值都可以作为String类型的对象加以描述,如:"abc"等。
该类描述的字符串内容是个常量,一旦创建完毕后则不能更改,因此可以被共享。
如:
String str1 = “abc”;
str1 = “123”; - 改变str1的指向而不是指向的内容
3.2 常量池(原理、尽量理解)
由于String类型描述的字符串内容是个常量不可改变,因此Java虚拟机提供了一个常量池,当Java程序中出现字符串内容时就放入常量池中,若后续出现重复的字符串内容则直接使用池中已有的对象而不需再次创建,从而提高了性能。
package Three;
import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;
public class StringTest {
public static void main(String[] args) {
// 1.使用无参方式构造String类型的对象并打印 "" null
String str1 =new String();
System.out.println("str1="+str1);//str1 = 啥也没有
System.out.println("--------------------------------");
// 2.使用字节数组来构造String对象并打印
byte[] bArr={97,98,99,100,101};
// 表示使用bArr数组中下标从1开始的3个字节来构造字符串对象
String str2=new String(bArr,1,3);
System.out.println("str2="+str2);//str2 = bcd
String str3=new String(bArr);
System.out.println("str3="+str3);//str3 = abcde
System.out.println("--------------------------------");
// 3.使用字符数组来构造String对象并打印
char[] cArr={'h','e','l','l','o'};
String str4=new String(cArr,1,4);
System.out.println("str4="+str4);//str4 = el
String str5=new String(cArr);
System.out.println("str5="+str5);//str5 = hello
System.out.println("--------------------------------");
// 4.使用字符串来构造String对象并打印
String str6 = new String("world");
System.out.println("str6 = " + str6); //str6 = world
}
}
作业:
1.重点掌握Student.java文件和StringConstructorTest.java文件的代码。
2.自定义Person类实现封装,特征有:姓名和年龄,要求以姓名为基准重写equals方法、hashCode方法以及toString方法。
3.尝试使用String类中的常用方法。