关于object类中的toString方法:
1.源代码:
public String toString(){
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
源代码上toString()方法的默认实现是:
类名@对象的内存地址转换为十六进制的形式
2.SUN公司设计的toString()方法的目的:
通过调用这个方法可以将一个"java对象"转换成"字符串"的表现形式
3.SUN公司开发java语言时,建议所有子类都去重写toString()方法。
结果应是一个简明但易于读懂的信息表达式
*/
**代码演示1:**
```java
public class reWritetoString {
public static void main(String[] args) {
Myworld myworld = new Myworld(1990, 11, 29);
String s = myworld.toString();
System.out.println(s);
}
}
class Myworld {
//定义属性
int year;
int month;
int day;
//无参构造
public Myworld(){ }
//有参构造
public Myworld(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
//重写子类toString方法
public String toString(){
return this.year + "/" + this.month + "/" + this.day;
}
}
```
**输出结果:**
1990/11/29
**课堂笔记2**:
/*
关于object类中的equals方法
1.equals方法的源代码:
```java
public boolean equals(Object obj) {
return (this == obj);
}
```
以上这个方法是object类的默认实现
2.SUN公司设计equals方法的目的是什么?
以后的编程过程当中,都要通过equals方法来判断两个对象是否相等。
equals方法是判断两个对象是否相等的。
3.我们需要研究一下object类给的这个默认的equals方法够不够用?
在object类中的equals方法当中,默认采用的是"=="来判断两个对象是否相等。
而"=="判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。
所有object类中的equals方法不够用,需要重写子类。
4.判断两个java对象是否相等,不能使用"==",因为"=="比较的是两个对象的内存地址
*/
**代码演示2:**
```java
public class Aboutequals {
public static void main(String[] args) {
//判断两个基本数据类型是否相等直接使用"=="就行
int a = 100;
int b = 100;
System.out.println(a == b); //true
//判断两个java对象是否相等,能直接使用"=="吗?
MyTime02 t1 = new MyTime02(2021, 02, 13);
String s = t1.toString();
System.out.println(s);
MyTime02 t2 = new MyTime02(2021, 02, 13);
//这里的"=="判断的是:MyTime中保存的对象内存地址和MyTime2中保存的对象内存地址是否相等
//重写equals方法之前的结果
System.out.println(t1 == t2); //false
//重写equals方法之后的结果
MyTime02 t3 = new MyTime02(2021, 02, 13);
System.out.println(t1.equals(t3));
}
}
class MyTime02 {
//定义属性
private int year;
private int month;
private int day;
//无参构造
public MyTime02() {}
//有参构造
public MyTime02(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String toString() {
return this.year + "/" + this.month + "/" + this.day;
}
//重写object类中的equals方法
//怎么重写,直接复制粘贴object类中的equals方法
/*
public boolean equals(Object obj) {
//当年月日相同时,表示两个日期相同,两个对象相等
//获取第一个日期的年月日
int year1 = this.year;
int month1 = this.month;
int day1 = this.day;
//获取第二个日期的年月日
if (obj instanceof MyTime02){
MyTime02 t = (MyTime02)obj;
int year2 = t.year;
int month2 = t.month;
int day2 = t.day;
if (year1 == year2 && month1 == month2 && day1 == day2){
return true;
}
}
return false;
}
*/
//改良版,重写equals方法
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof MyTime02)){
return false;
}
if (this == obj){
return true;
}
MyTime02 t = (MyTime02)obj;
return this.year == t.year && this.month == t.month && this.day == t.day;
}
}
```
**输出结果:**
true
2021/2/13
false
true
**代码演示3:**
```java
public class Aboutequals02 {
public static void main(String[] args) {
Student s1 = new Student(1001011, "二中");
Student s2 = new Student(1001011, "二中");
System.out.println(s1.equals(s2));
}
}
class Student {
int no;
String school;
public Student(){}
public Student(int no, String school){
this.no = no;
this.school = school;
}
//重写equals方法
//需求:当一个学生的学号相等,并且学号相同时,表示同一个学生;
//equals方法的编写都是固定的。架子差不多
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Student)) return false;
if (this == obj) return true;
Student s = (Student)obj;
return this.no == s.no && this.school.equals(s.school);
}
}
```
输出结果:
true
**代码演示4:**
```java
public class Aboutequals03 {
public static void main(String[] args) {
// Address a = new Address("北京", "朝阳区", "1001011");
User u1 = new User("张三", new Address("北京", "朝阳区", "1001011"));
User u2 = new User("张三", new Address("北京", "朝阳区", "1001011"));
System.out.println(u1.equals(u2));
}
}
class User {
String name;
Address addr;
public User(){}
public User(String name, Address addr){
this.name = name;
this.addr = addr;
}
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof User)) return false;
if (this == obj) return true;
User u = (User)obj;
return this.name.equals(u.name) && this.addr.equals(u.addr);
}
}
class Address {
String city;
String street;
String zipcode;
public Address() {}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Address)) return false;
if (this == obj) return true;
Address a = (Address)obj;
return this.city.equals(a.city) && this.street.equals(a.street) && this.zipcode.equals(a.zipcode);
}
}
```
输出结果:
true
**课堂笔记2:**
/*
java语言当中的字符串String有没有重写toString方法和equals方法?
1.String类中已经重写了equals方法,比较两个字符串不能使用"==",必须使用equals。
2.String类已经重写了toString方法。
3.java中基本数据类型比较是否相等时使用"=="。
java中所有引用数据类型统一使用equals方法来判断是否相等。
*/
**代码演示5:**
```java
public class AboutReWrite {
public static void main(String[] args) {
//大部分情况下采用这种方式创建字符串对象
String s1 = "hello";
String s2 = "world";
//实际上String也是一个类,属于引用数据类型
//String既然是一个类,那么一定存在构造方法
String s3 = new String("Demo01");
String s4 = new String("Demo01");
System.out.println(s3.equals(s4));
}
}
```
输出结果:
true
**课堂笔记3:**
/*
关于object类中的finalize()方法
1.在object类中的源代码:
protected void finalize() throws Throwable { }
2.finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
3.这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。
4.finalize()方法的执行时机:
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。
5.finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
6.java中的垃圾回收器不是轻易启动的,垃圾太少或者时间没到,种种条件下,
有可能启动,也有可能不启动。
*/
**代码演示6:**
```java
public class Aboutfinalize {
public static void main(String[] args) {
for(int i = 0; i <= 100000000; i++){
ABC a = new ABC();
a = null;
}
}
}
class ABC {
//项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间。
//记录对象被释放的时间点,这个负责记录的代码就写到finalize()方法中。
protected void finalize() throws Throwable {
System.out.println("即将被销毁");
}
}
```