1,所有类都从Object类中继承equals()方法
2,Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的hi同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false,注意:即便是内容完全相等的两块不同的内存对象,也返回false。
3,如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false
4,如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equals()方法(类似于String类中重写的toString()方法)
5,String类已经重写了object中的equals方法
1,toString
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。
/*public String toString();返回该对象的字符串表示
*
*
* getClass().getName() + '@' + Integer.toHexString(hashCode())
*
* Integer类下的一个静态方法
* public static String toHexString(int i):把一个整数转化为16进制表示的字符串
*
* 现在是没有意义的,所以建议子类重写该方法(把该类的所有成员变量值组成返回即可),可以自动生成
*/
public class ToStringTest {
public static void main(String[] args) {
teacher t2 = new teacher();
teacher t3 = new teacher();
System.out.println(t2);
System.out.println(t3);
System.out.println("-----------------");
System.out.println(t2.hashCode());//366712642
System.out.println(t2.getClass().getName());
System.out.println("-----------------");
System.out.println(t3.hashCode());//1829164700
System.out.println(t3.getClass());
System.out.println("-----------------");
System.out.println(t2.toString());
System.out.println(t3.toString());
System.out.println("-----------------");
System.out.println(t2.getClass().getName()+'@'+Integer.toHexString(t2.hashCode()));
System.out.println(t2.toString());
}
}
class teacher{
private String name;
private int age;
public teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}
public teacher() {
super();
// TODO 自动生成的构造函数存根
}
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;
}
//@Override
//public String toString() {
// TODO 自动生成的方法存根
// return super.toString();
//return "hello";
//}
@Override
public String toString() {
return "teacher [name=" + name + ", age=" + age + "]";
}
}
————————————————
版权声明:本文为CSDN博主「围巢111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40817827/article/details/89072258
————————————————
这里的知识引用了围巢111的这篇博客
2,子类可以使用父类中的方法,且Object类是所有类的默认父类(只要你不extends其他类),也就是说所有类都继承Object类,所以如果子类中不重写,就会按Object类中的构造的那样输出
1,在object类中的源代码:
protected void finalize()throws Throwable()
2,finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
class Person{
protected void finalize()throws Throwable{
// this代表当前对象
// 当对象被销毁时,finalize()方法才会被运行
System.out.println(this+"即将被销毁!");
}
}
3,这个方法不需要程序员手动调用,JVM垃圾回收器负责调用这个方法。
不像equals和toString方法,equals和toString方法是需要你来写代码调用的
finalize()方法只需要重写,写完将来自动会有程序来调用。
4,finalize()方法的执行时机:
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用
public class Finalize{
public static void main(String[] args) {
// 创建对象
for(int i=0;i<10000000;i++){
Person p=new Person();
// 怎么把垃圾回收器变成垃圾?
//
// 有一段代码可以建议垃圾回收器启动,当然只是建议,在垃圾过少时还是不一定成功,只是启动的概率高了些
p=null;
}
}
}
5,finalize()方法实际上是sun公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
6,这其实有点像静态代码块,静态代码块的作用是什么?
static{
…
}
静态代码块在类加载时执行,并且只执行一次。
这是一个sun准备的类加载时机。
finalize()方法同样也是sun为程序员准备的一个时机。
这个时机是垃圾回收时机
7,java中的垃圾回收器不是轻易启动的,垃圾太少,或者时间没到,种种条件下,就有可能启动有可能不启动。
//项目开发中有这样的业务需求:所有对象在JVM虚拟机中释放的时候,请记录一下释放时间!!!
//记录对象被释放的时间点,这个负责记录的代码写在哪里?
//写到finalize()方法中。
public class Finalize{
public static void main(String[] args) {
// 创建对象
for(int i=0;i<10000000;i++){
Person p=new Person();
// 怎么把垃圾回收器变成垃圾?
//
// 有一段代码可以建议垃圾回收器启动,当然只是建议,在垃圾过少时还是不一定成功,只是启动的概率高了些
p=null;
System.gc();
}
}
}
hashcode()方法返回的是哈希码:
1,实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。
2,所以hashcode()方法的运算结果可以等同看作一个java对象的内存地址。
public class HashCode{
public static void main(String[] args) {
Object o=new Object();
int hashcodevalue=o.hashCode();
System.out.println(hashcodevalue);//460141958
Myclass clas=new Myclass();
hashcodevalue=clas.hashCode();
System.out.println(hashcodevalue);//1163157884
Myclass clas2=new Myclass();
System.out.println(clas2.hashCode());//1956725890
}
}