JAVA中Object类的学习
Object类的学习
只需要知道这几个方法即可:
protected Object clone() // 负责对象克隆的。
int hashCode() // 获取对象哈希值的一个方法。
boolean equals(Object obj) // 判断两个对象是否相等
String toString() // 将对象转换成字符串形式
protected void finalize() // 垃圾回收器负责调用的方法
toString()方法
-
以后所有类的toString()方法是需要重写的。
-
重写规则,越简单越明了就好。
-
System.out.println(引用); 这里会自动调用“引用”的toString()方法。
-
源代码长什么样?
public String toString() { return this.getClass().getName() + "@" + Integer.toHexString(hashCode()); } -
toString()方法的作用是什么? toString()方法的设计目的是:通过调用这个方法可以将一个“java对象”转换成“字符串表示形式”
-
String类是SUN写的,在String类中toString方法已经重写了。
equals()方法
-
以后所有类的equals方法也需要重写,因为Object中的equals方法比较的是两个对象的内存地址,我们应该比较内容,所以需要重写。
-
重写规则:自己定,主要看是什么和什么相等时表示两个对象相等。
-
基本数据类型比较使用:==
-
对象和对象比较:调用equals方法(引用数据类型之间的比较)
-
String类是SUN编写的,所以String类的equals方法重写了。
-
以后判断两个字符串是否相等,不能使用==,要调用字符串对象的equals方法。因为字符串是一个对象。
-
equals方法是判断两个对象是否相等的。 判断两个java对象是否相等,不能使用“==”,因为“==”比较的是两个对象的内存地址。
-
注意:重写equals方法的时候要彻底。
-
equals方法的源代码
public boolean equals(Object obj) { return (this == obj); } -
在Object类中的equals方法当中,默认采用的是“==”判断两个java对象是否相等。而“==”判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。所以老祖宗的equals方法不够用,需要子类重写equals。
-
java中基本数据类型比较是否相等,使用==
-
java中所有的引用数据类型统一使用equals方法来判断是否相等。
代码实例1
public class SuperStudy {
public static void main(String[] args) {
int num1 = 100;
int num2 = 100;
System.out.println(num1 == num2);// true
Mytime mytime1 = new Mytime(2008,8,8);
System.out.println(mytime1);// 2008年8月8日
Mytime mytime2 = new Mytime(2008 ,8,8);
System.out.println(mytime1 == mytime2);// false
// true(重写equals方法之后,如果不重写equals方法则比较的是对象之间的内存地址,则与上面的结果相同)
System.out.println(mytime1.equals(mytime2));
Mytime mytime3 = new Mytime(2008,8,9);
System.out.println(mytime1.equals(mytime3));// false
Mytime mytime4 = null;
System.out.println(mytime1.equals(mytime4));// false
}
}
class Mytime extends Object{
private int year;
private int month;
private int day;
public void setYear(int day){this.day = day;}
public void setMonth(int month){this.month = month;}
public void setDay(int day){this.day = day;}
public int getYear(){return this.year;}
public int getMonth(){return this.month;}
public int getDay(){return this.day;}
public Mytime(){super();}
public Mytime(int year,int month,int day){
super();
this.year = year;
this.month = month;
this.day = day;
}
public boolean equals(Object obj) {
if(obj == null || ! (obj instanceof Mytime)){
return false;
}
if(this == obj){
return true;
}
if(obj instanceof Mytime){
Mytime mytime = (Mytime) obj;
if(this.getYear() == mytime.getYear() && this.getMonth() == mytime.getMonth() && this.getDay() == mytime.getDay()){
return true;
}
}
return false;
}
@Override
public String toString() {
return this.year+"年"+this.month+"月"+this.day+"日";
}
}
代码实例1
public class SuperStudy {
public static void main(String[] args) {
User user1 = new User("张三",new Address("北京","大兴区","11111"));
User user2 = new User("张三",new Address("北京","大兴区","11111"));
System.out.println(user1.equals(user2));
System.out.println(user1);
}
}
class User{
private String name;
private Address addr;
public User(){super();}
public User(String name, Address address){super();this.name = name;this.addr = address;}
public void setName(String name){this.name = name;}
public void setAddr(Address address){this.addr = address;}
public String getName(){return this.name;}
public Address getAddr(){return this.addr;}
@Override
public boolean equals(Object obj) {
if(obj == null || ! (obj instanceof User)){return false;}
if(this == obj){return true;}
if(obj instanceof User){
User user =(User)obj;
return this.getName().equals(user.getName()) && this.getAddr().equals(user.getAddr());
}
return false;
}
@Override
public String toString() {
return "姓名:"+this.getName()+"\n地址=\t"+this.getAddr();
}
}
class Address{
private String city;
private String street;
private String zipcode;
public Address(){super();}
public Address(String city,String street, String zipcode){
super();
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public void setCity(String city){this.city = city;}
public void setStreet(String street){this.street = street;}
public void setZipcode(String zipcode){this.zipcode = zipcode;}
public String getCity(){return this.city;}
public String getStreet(){return this.street;}
public String getZipcode(){return this.zipcode;}
@Override
public String toString() {
return "城市:"+this.getCity()+"\t街道:"+this.getStreet()+"\t门牌号:"+this.getZipcode();
}
@Override
public boolean equals(Object obj) {
if(obj == null || ! (obj instanceof Address)){return false;}
if(this == obj){return true;}
if(obj instanceof Address){
Address address = (Address) obj;
return this.getCity().equals(address.getCity()) && this.getStreet().equals(address.getStreet()) && this.getZipcode().equals(address.getZipcode());
}
return false;
}
}
finalize()方法。
-
这个方法是protected修饰的,在Object类中这个方法的源代码是?
protected void finalize() throws Throwable {} -
finalize()方法只有一个方法体,里面没有代码。
-
GC:负责调用finalize()方法。
-
这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。不像equals toString,equals和toString()方法是需要你写代码调用的。finalize()只需要重写,重写完将来自动会有程序来调用。
-
调用finalize()方法被成为一个时机,这个时机是垃圾回收时机。
-
finalize()方法的执行时机: 当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。
代码实例
public class SuperStudy {
public static void main(String[] args) {
for (int i=0;i<100;i++){
Person person = new Person();
person = null;// 将person对象变成垃圾
System.gc();// 建议启动垃圾回收器。(只是建议,可能不启动,也可能启动。启动的概率高了一些。)
}
}
}
class Person{
// Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用:person.finalize();
protected void finalize() throws Throwable{
System.out.println(this+"即将被销毁!");
}
}
hashCode()方法
-
在Object中的hashCode方法是怎样的?
public native int hashCode(); 这个方法不是抽象方法,带有native关键字,底层调用C++程序。
-
hashCode()方法返回的是哈希码: 实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。 所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。
public class SuperStudy {
public static void main(String[] args) {
MyClass myClass = new MyClass();
System.out.println(myClass.hashCode());// 2003749087
}
}
class MyClass{}
匿名内部类
public class SuperStudy {
public static void main(String[] args) {
// 创建数学对象
Mymath mymath = new Mymath();
ComputerImp computerImp = new ComputerImp();
mymath.mysum(computerImp,100,200);
// 创建一个无名的对象区调用这个类实现的sum方法
mymath.mysum(new ComputerImp(),200,300);
// 去new接口在其后面加上{}在{}中写接口抽象方法的实现,这就是匿名内部类.
mymath.mysum(new Computer() {
@Override
public int sum(int num1, int num2) {
return num1+num2;
}
},300,400);
}
}
// 负责计算的接口
interface Computer{
// 抽象的方法
int sum(int num1 ,int num2);
}
// 写一个类实现其接口
class ComputerImp implements Computer{
// 对抽象方法的实现
public int sum(int num1, int num2){
return num1+num2;
}
}
class Mymath{
// 数学的求和方法
public void mysum(Computer computer ,int num1 ,int num2){
int retValue = computer.sum(num1,num2);
System.out.println(num1+"+"+num2+"="+retValue);
}
}