1.所有类的最终父类都是object;object是最终类所以它没有构造函数(因为他没有父类)
2.native本地函数:就是指当前的方法内容有计算机具体的底层来实现 C/C++语言
private static native void registerNatives();
Object的这个类一旦被加载进方法区 则执行 注册本地方法registerNatives(); 就会在底层去创建一个Object对象并对类进行一定程度上初始化
static {
registerNatives();
}
3.public是权限修饰符,final是函数修饰符---表示函数不可能被重写
final修饰变量 表示该变量所存储的数据的地址不能被改变
final修饰函数 表示该函数不能被重写
final修饰类 表示该类不能被继承
所有Object的子类 可以继承到此方法 但是不能重写
功能:主要就是获取当前类的信息(类的全路径和类的名称--也就是当前对象的类的对象 - Class类)
Class是 Java类的描述的一个类------就是字节码的类 .class文件当成一个对象去看待 Class就是该对象的类
当然该方法也是一个本地方法
public final native Class<?> getClass();
4.该方法也是一个本地方法
功能:获取当前对象的哈希值(在哈希表中的一个存储位置)
本方法可以被重写:
如果子类重写该方法 就意味着有子类去决定它自己的哈希值
如果子类没有重写该方法 默认将该对象的地址当做哈希值
public native int hashCode();
5.功能:当前对象this和传入的对象obj是否相等
对于Object而言 比较的其实就是两个对象的地址!!!
如果子类没有重写该方法 那么也默认进行地址的比较!!!
【一般而言 我们比较的应该对象的内容 而不是对象的地址】
【== equals有什么区别:==比的永远是地址 equals在Object中与==一样 当然 也可以由子类自行重写】
public boolean equals(Object obj) {
return (this == obj);
}
没有重写equals方法
package part01.Object;
//所有类的最终父类都是object
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {
super();
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
//要打印具体信息时,必须重写toString
@Override
public String toString() {
return "姓名"+this.name+","+"年龄"+this.age;
}
}
package part01.Object;
public class Demo01 {
public static void main(String[] args) {
Object obj=new Object();
System.out.println(obj);
System.out.println(p1==p2);//false
System.out.println(p1.equals(p2));//false //此时并没有重写equals,此处的equals是在object类中的,所以它和==的作用一致
}
}
/*
运行结果:
false
false
*/
重写equals方法
package part01.Object;
//所有类的最终父类都是object
public class Person {
private int age;
private String name;
//自己重写equals函数 实现当前类中对象的比较内容
@Override
public boolean equals(Object obj) {//Objcet obj=p2=new Person(20,"老王")
//1.是否自己比自己
if (this==obj) {
return true;
}
//2.obj是否为空
if(obj==null) {
return false;
}
//3.obj是否属于当前类Person的类型
if(obj instanceof Person) {
Person person=(Person) obj;
//name是字符串,比较用equals age是基本数据类型 比较用==
return this.age==person.age && this.name.equals(person.name);
}
return false;
}
}
package part01.Object;
public class Demo01 {
public static void main(String[] args) {
Object obj=new Object();
System.out.println(obj);
System.out.println(p1==p2);//false
//需求:如果两个对象的属性完全相等则表示两个对象相等 age相等,name相等 ---- 重写equals
//System.out.println(p1.equals(p2));//true 重写equals
}
}
/*
运行结果:
false
true
*/
6.功能:就是当我们直接打印一个对象时 打印的内容默认就是toString返回的内容
返回当前对象的字符串形式
Object obj=new Object();
println(obj); == println(obj.toString()); //如果没有重写toString的方法的话,则打印的是: 全类名+@+十六进制哈希值的字符 串形式
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
没有重写toString方法
package part01.Object;
//所有类的最终父类都是object
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {
super();
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
}
package part01.Object;
public class Demo01 {
public static void main(String[] args) {
Object obj=new Object();
System.out.println(obj);
Person p1=new Person(20,"老王");
Person p2=new Person(20,"老王");
System.out.println(p1.toString());
System.out.println(p2.toString());
}
}
/*
运行结果:
java.lang.Object@15db9742
part01.Object.Person@6d06d69c //因为是两个对象所以地址不一样
part01.Object.Person@7852e922
*/
重写toString方法
package part01.Object;
//所有类的最终父类都是object
public class Person {
private int age;
private String name;
//getter setter方法
//无参的构造函数
//两个参的构造函数
//要打印具体信息时,必须重写toString
@Override
public String toString() {
return "姓名"+this.name+","+"年龄"+this.age;
}
}
package part01.Object;
public class Demo01 {
public static void main(String[] args) {
Object obj=new Object();
System.out.println(obj);
Person p1=new Person(20,"老王");
Person p2=new Person(20,"老王");
System.out.println(p1.toString());
System.out.println(p2.toString());
}
}
/*
运行结果:
java.lang.Object@15db9742
姓名老王,年龄20
姓名老王,年龄20
*/
7. 当对象被垃圾收集器回收时 会执行该方法 可以理解为是“临刑前的遗言”
protected void finalize() throws Throwable { }