java2_day07 java常用类之Objects类和包装类
目录
-
Object类的使用
-
单元测试方法的使用
-
包装类的使用
1 Object类的使用
-
object类包含以下几个方法
-
hashcode() 集合里边有讲
-
toString()
-
clone() 用的较少
-
getClass() 获取当前对象的类,反射讲
-
notify() 多线程里讲
-
wait() 多线程里讲
-
equals()
-
-
Object类是所有Java类的根父类
-
如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
-
public class Person{
}
等价于
-
public class Person extends Object{
}
-
-
例:method(Object obj){...} //可以接收任何类作为其参数
Person o = new Person();
method(o);
-
程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行回收依然不确定。
-
对象回收之前会先调用finalize方法
面试题:final、finally、finalize的区别?
-
前两个是关键字,finalize是方法,一般不要主动调用。
1.1 Object中equals()方法
面试题:==和equals的区别
package com.xin.java;
/**
* Created with IntelliJ IDEA.
* User: xinxueqi
* Date: 2022/4/28 11:24
* Description:
* 面试题: == 和 equals()的区别
* 一、 ==运算符:
* 1. 可以使用在基本数据类型变量和引用数据类型的变量中
* 2. 如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等。(不一定类型要相同)
* 如果比较的是引用数据类型变量,比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体。
*二、 equals()方法的使用
* 1. 是一个方法,而非运算符
* 2. 只能适用于引用数据类型,(像类才能用点后面加方法的方式)。
* 3. Object中equals()的定义:
* public boolean equals(Object obj) {
* return this == obj;
* }
* 说明: Object类中定义的equals()和==作用是相同的,比较两个对象的地址值是否相同。
* 4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,
* 比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
* 5. 通常情况下,我们自定义的类如果使用equals()的话,也是比较两个对象的实体内容是否相同,那么
* 我们就需要对Object类中的equals()方法进行重写。
*/
public class EqualsTest {
public static void main(String[] args) {
int i =10;
int j = 10;
double d = 10.0;
System.out.println(i == j); //TRUE
System.out.println(i == d); //TRUE,数值相等就行,和类型无关
boolean b = true;
// System.out.println(i == b); //不能和布尔型比较,编译报错
char c = 10;
System.out.println(i == c); //TRUE
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2); //TRUE
Customer cust1 = new Customer("Tom", 21);
Customer cust2 = new Customer("Tom", 21);
System.out.println(cust1 == cust2); //false,地址值不同
String str1 = new String("atguigu");
String str2 = new String("atguigu");
System.out.println(str1 == str2); //false,地址值不同
System.out.println("===============================");
//equals()方法测试
System.out.println(cust1.equals(cust2)); //false ,看底层,用的是object里边的equals()方法, 里边用的也是==
//重写了customer类之后,结果为true
System.out.println(str1.equals(str2)); //TRUE,用的是String里边的equals()方法,String里边进行了重写
}
}
Customer类如下:
package com.xin.java;
import java.util.Objects;
/**
* Created with IntelliJ IDEA.
* User: xinxueqi
* Date: 2022/4/28 11:57
* Description:
*/
public class Customer {
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写的原则,比较两个对象的实体内容(即name和age)是否相同
// @Override
// public boolean equals(Object obj) {
// return super.equals(obj);
// }
-
重写equals()方法的原则
-
对称性:如果x.equals(y)返回是“true” ,那么y.equals(x)也应该返回是“true
-
自反性: x.equas(x)必须返回是“true"
-
传递性:如果x.equals(y)返回是 “true",而且y.equals(z)返回是 “true”,那么z.equals(x)也应该返回是“true';”。
-
一致性:如果x.equals(y)返回是 “true" ,只要x和y内容一直不变, 不管你重复x.equals(y)多少次,返回都是“true”。
-
任何情况下, x.equals(null), 永远返回是“false”;
-
x.equals(和x不同类型的对象)永远返回是“false”
-
练习题1:
package com.xin.java;
/**
* Created with IntelliJ IDEA.
* User: xinxueqi
* Date: 2022/4/29 9:48
* Description:
* equals()练习1:
* 编写Order类,有int型的orderId, String型的orderName,
* 相应的getter( )和setter( )方法,两个参数的构造器,
* 重写父类的equals( )方法: public boolean equals(Object obi ).
* 并判断测试类中创建的两个对象是否相等。
*/
public class OrderTest {
public static void main(String[] args) {
Order order1 = new Order(1001, "AA");
Order order2 = new Order(1001, "BB");
Order order3 = new Order(1001, new String("BB"));
//如果重写equals时,name不用equals方法的时候,很可能会出错,因为这里是通过new的方式建立的字符串
System.out.println(order1.equals(order2)); //false
System.out.println(order3.equals(order2)); //true
}
}
//Order类也可以新建一个文件
class Order{
private int orderId;
private String orderName;
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Order(int orderId, String orderName) {
this.orderId = orderId;
this.orderName = orderName;
}
练习题2:
-
请根据以下代码自行定义能满足需要的MyDate类, 在MyDate类中覆盖equals方法,使其判断当两个MyDate类型对象的年月日都相同时,结果为true,否则为false。 public boolean equals(Object O)
package com.xin.java;
/**
* Created with IntelliJ IDEA.
* User: xinxueqi
* Date: 2022/4/29 10:13
* Description:
*/
public class MyDateTest {
public static void main(String[] args) {
MyDate m1 = new MyDate(14, 3, 1976);
MyDate m2 = new MyDate(14, 3, 1976);
if(m1 == m2){
System.out.println("m1 == m2");
}else{
System.out.println("m1 != m2"); //bingo
}
if(m1.equals(m2)){
System.out.println("m1 is equal to m2"); //bingo
}else{
System.out.println("m1 is not equal to m2");
}
}
}
class MyDate{
private int day;
private int month;
private int year;
public MyDate(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}