Object类是java类的根基类
Object类中的toString()方法:
1、SUN在object类中设计toString的目的:返回java对象的字符串的表现形式。
在现实的开发过程中,Object里边的toStirng方法已经不够用了,因为Objecty的toString方法实现的结果
不满意,所以Object中的很多方法被重写了。
2、Object中的toString方法返回:类名@java对象的内存地址经过哈希算法得出int类型值再转换成16进
制,这个输出结果可以等同的看作java对象在堆中内存地址
举个栗子:
public class Test{
public static void main(String [] args) {
Object o1 = new Object();
String str = o1.toString();
System.out.println(str); // java.lang.Object@123772c4
Person p1 = new Person("HL", 0);
String pStr = p1.toString();
System.out.println(pStr); // tranc.Person@7d6f77cc
Person p2 = new Person("gl", 50);
System.out.println(p2.toString());
System.out.println(p2); // 结果同上
// 注意:print方法后面括号,如果是一个引用类型,会默认调用给引用类型的toStirng()方法
}
}
class Person{
String name;
int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
// person默认继承Object类,所以可以重写toString方法
// 根据项目要的需求而定
// 需求规定, 现实格式:person【name = "hl",age = 50】
public String toString() {
return "person[name = " + this.name + ",age=" + this.age + "]";
}
}
输出:
java.lang.Object@123772c4
person[name = HL,age=0]
person[name = gl,age=50]
person[name = gl,age=50]
Object类中的equals()方法:
equals方法:
实现:
public boolean equals (Object obj){
return (this == obj);
}
equals方法比较的是两个引用中的内存地址
java类中的equals方法的设计目的:判断两个对象是否一样
举个栗子:
public class Test{
public static void main(String [] args) {
Object o1 = new Object();
Object o2 = new Object();
boolean b = o1.equals(o2);
// 根据源杩:return (o1 == o2)
// ==号两边,内存地址相等,返回true,不相等,返回false
System.out.println(b); // false
Star s1 = new Star(100,"hl");
Star s2 = new Star(100,"hl");
Star s3 = new Star(101,"hl");
System.out.println(s1.equals(s2)); // false
// 我们发现,在现实的业务逻辑中,不应该比较内存地址,而是应该比较内容
//所以,equals需要重写 public boolean equals(Star s)
System.out.println(s1.equals(s3));
}
}
class Star{
int id;
String name;
// Constructor
public Star(int id,String name) {
this.id = id;
this.name = name;
}
// 法一:
// public boolean equals(Star s) {
// if(this.id == s.id && this.name == s.name) {
// return true;
// }else {
// return false;
// }
// }
// 法二:
public boolean equals(Object obj) {
if(this == obj) return true; // 如果地址都相等,那么内容一定相等
if(obj instanceof Star) { // nstanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
Star s = (Star)obj;
if(this.id == s.id && this.name == s.name ){
return true;
}else {
return false;
}
}else {
return false;
}
}
}
输出:
false
true
false
补充、重要: 关于java语言中如何比较两个字符串是否一致
在java中比较两个字符串是否一致,不能使用”==“,严禁
字符串是引用数据类型,不是基本数据类型,所以只能调用String类中的equals
举个栗子:
public class Test2 {
public static void main(String args[]) {
String s1 = new String("123");
String s2 = new String("123");
System.out.println(s1 == s2); // false
//String已经重写了Object中的equals方法,比较的是内容
System.out.println(s1.equals(s2)); // true
}
}
输出:
false
true
Object类中的finalize()方法:
和垃圾回收器紧密联系在一起
1、finalize方法,每个java对象都有
2、finalize方法,不需要程序员调用,由系统自动调用
3、java对象如果没有更多的引用指向它,则该java对象成为垃圾数据,等待垃圾回收器的回收,垃圾回收器在回收这个对象之前会自动调用该对象的finalize方法
finalize方法是该对象马上要被回收了,例如:需要释放资源,则可以在该方法中释放
举个栗子
public class Test{
public static void main(String [] args) {
Person p1 = new Person();
p1 = null; // 无引用指向,等待回收
// 程序员只能“建议” 垃圾回收回收垃圾
System.gc(); // 运行垃圾回收器
}
}
class Person{
protected void finalize() throws Throwable{
System.out.println(this + "马上就要被回收了");
// 让引用再次重新指向该对象,该对象不是垃圾,不会被回收!
// Person p = this;
}
}
输出:
tranc.Person@345a315e马上就要被回收了
网友评论