我们API文档,以及jdk版本,以及rt-jar应该是对应相同的版本
帮助文档尽量看英文的
Object是所有类层级的根(Class Object is the root of the class hierarchy)
关于Object中的toString方法
SUN在Object类中设计toString(),目的是返回java对象的字符串表示形式
在现实的开发过程中,Object里边的toString方法已经不够用了。
因为Object的toString方法不够用
大部分都是要重写toString方法
SUN是这样写toString方法的:
public String toString(){
return getClass().getname() + '@' +Integer.toHexString(hashCode());
}
Object中的toString方法返回: 类名@ java对象的内存地址经过哈希算法得出的int类型值再 转换成十六进制
这个输出结果可以等同看做java对象在堆中的内存地址。
public class Test{
public static void main(String[] args){
//创建一个Object类型的对象.
Obejct o1 = new Object();
//调用toString方法
String oStr = o1.toString();
System.out.println(oStr);//打印看这个方法是什么
//运行结果:java.lang.Object@34c45dca
}
Person p1 = new Person();
String pStr = p1.toString(); //默认继承了Object类同时也会继承其内部的方法
System.out.println(pStr); //test.Person@5b6f7412,
//重写后输出重写的方法
//观察直接输出对象名的现象
Person p2 = new Person();
//则说明System.out.println(引用类型); 会调用引用类型的toString方法
System.out.println(p2); //输出:Person[name=gongli,age=50]
}
//所有类都会默认继承Object类
class Person{
String name;
int age
public Person(String name,int age){
this.name = name;
this.age = age;
}
//重写toString方法
//根据项目的需求而定。
//需求规定,显示格式
public String toString(){
return "Person[name="+name+",age="+age+"]";
}
}
1.关于Object类中的equal方法. 也是需要按照需求进行重写的
2.源码中Object中的equals写法:
public boolean euqals(Object obj)
{
return(this == obj);
}
是通 过内存地址来判断是否相等的,相同为true,不同为false
Object中的equals方法比较的是两个引用的内存地址
3.Object 中的equals方法的设计目的:判断两个对象是否一样
4.在现实的业务逻辑中,比较是否相等应该看内容,所以原来的比较内存地址就不够用了,所以需要重写,按照业务需求重写
public class Test{
public static void main(String[] args){
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2)); //这里输出的结果为false,因为对比源码可以知道 o2和o1 是通 过内存地址来判断是否相等的,相同为true,不同为false
Star s1 = new Star(100,"xuz");
Star s2 = new Star(100,"xuz");
System.out.println(s1.equals(s2)); //按照上面的分析,在重写equals之前这里会输出false
//
}
}
class Star{
//明星的id
int id;
//明星的名字
String name;
public Star(int id,String name)
{
this.id = id;
this.name = name;
}
//重写要求为,如果身份证号一致,并且名字一致,则代表为同一个人
//根据需求重写Object方法
public boolean equals(Object obj) //这里用到了多态,首先Star继承与Object,euqals的形参里传的是 Obejct类(父类) obj, 实际上我们如果比较两个Star类之间,传进来的也是一个Star类(子类),但是我们 是要去比较name 以及id ,这两个属性在Object类型中是没有的,所以需要将obj进行一个强制类型转换,将其 转换为Star类,则将会有name以及id的属性
{
if(obj instanceof Star) //类型判断,防止不是Star类传进来,导致子类之间互转,因为euqals的入口是 Object类,所有的Object子类均可传进来
{
Star s1 = Star(obj); //父类型为子类型
if(/*s1.name = this.name*/(通过下面的分析可以发现,两个字符串是否相等,不能直接通过等号来 判断)s1.equals(s2) == true && s1.id = this.id) //字符串的比较在下面介绍
{return true;}
}
return false;
}
}
关于比较java语言中如何比较两个字符串是否一致
String类里也会重写equals方法的
public class Test01{
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); //结果为false
System.out.println(s1.equals(s2));//结果为true 从这里看出String中equals方法是被重写过的,否 则比较两个类的内存地址是会返回false的
}
/*以下是String类里的源代码,为String类里对equals的重写*/
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
关于Objecet中的finalize方法
finallize方法什么时候调用?
1.finallize方法每个java对象都有
2.finallize方法不需要程序员调用,由系统自动调用。
3.java对象如果没有更多的引用去指向它,则该java对象称为垃圾数据。
等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动调用该对象的finallize 方法
finallize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中去释放
protected void finalize() throws Throwable { } 从JDK13 Object类里粘下来的源码
public class Test{
public static void main(String[] args){
Person p1 = new Person();
p1 = null;//没有引用再指向它,等待回收
//程序员只能“建议”垃圾回收,回收垃圾
System.gc();
}
}
class Person{
//重写Object中的finallize方法. 重写一个Object方法的时侯,直接去Obeject源码中粘贴,防止写错
protected void finalize() throws Throwable {
System.out.println(this + "马上后就要被回收了");
//让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收
//Person p = this;
}
}
hashCodef方法返回的是该对象的哈希码值
java对象的内存地址经过哈希算法得出的int类型的值
public class Test{
public static void main(String[] args){
Test t1 = new Test();
System.out.println(t1.hashCode());
}
}