图片-小白之家
图片-小白之家
图片-小白之家
图片-小白之家

java.lang.object(java.lang.object类的方法有哪些)

clone()

创立并回来此目标的一个副本。

//定义一个Person类

classPerson{

Stringname;

intage;

publicPerson(Stringname,intage){

this.name=name;

this.age=age;

}

}

Personp=newPerson(“Matrixx”,10);

Personp1=(Person)p.clone();

System.out.println(p);

System.out.println(p1);

能够从打印结果看到目标的地址是不同的,也便是说clone()创立了新的目标,而不是像下面这样把原目标的引证赋值给引证变量。

Personp1=p;

1

在运用clone()需要留意一个深复制和浅复制的问题,那么什么是深复制和浅复制呢?

仍是以上面的两个目标来举例。咱们能够从Person知道,Person有一个寄存名字的String类型的变量name和一个寄存年龄的int类型的变量age,int是基本数据类型,在复制时直接复制数值过来就行,可是name变量的类型是String,是一个引证类型,这时就可能出现两种方式的复制了:

一种是把原目标的name特点的引证值复制给新目标,这样原目标与新目标的name特点都指向同一个字符串目标,这种办法便是浅复制。

另一种是创立一个新的与原目标name属相同内容的字符串目标,把新的字符串目标赋值给新复制的目标,这个办法便是深复制。

那么运用clone()办法后的新目标是浅复制仍是深复制呢?

Stringresult=p.getName()==p1.getName()?”clone是浅复制的”:”clone是深复制的”;

System.out.println(result);

通过这种验证办法咱们知道clone()是浅复制的。所以在编写程序时要留意这个细节。

假如想进行深复制的话能够重写clone()办法,假如在复制一个目标时,要想让这个复制的目标和源目标完全彼此独立,那么在引证链上的每一级目标都要被显式的复制。所以创立彻底的深复制是非常麻烦的,尤其是在引证关系非常复杂的状况下,或许在引证链的某一级上引证了一个第三方的目标,而这个目标没有实现clone()办法,那么在它之后的一切引证的目标都是被共享的。也便是不彻底的深复制。

finalize()

当JVM的废物收回器确认不存在对该目标的更多引证时,由目标的废物收回器调用此办法。

getClass()

回来一个目标所属类的的类目标,常用于反射。

Java反射机制是在程序运行时,对于恣意一个类,都能够知道这个类的一切特点和办法;对于恣意一个目标,都能够调用它的恣意一个办法和特点。这种动态的获取信息以及动态调用目标的办法的功用称为Java的反射机制。
图片[1]-java.lang.object(java.lang.object类的方法有哪些)-小白之家

publicclassTest{

publicstaticvoidmain(String[]args){

Personp=newPerson(“Matrixx”,10);

System.out.println(p.getClass());//取得当时目标的类类型,输出:classxxx.xxx.Person

System.out.println(p.getClass().getName());//依据当时目标的类类型取得全类名,输出:xxx.xxx.Person

}

}

classPerson{

Stringname;

intage;

publicPerson(Stringname,intage){

this.name=name;

this.age=age;

}

}

equals()

用于比较此目标与某个目标是否相等,默认比较目标地址,可重写此办法定制比较规矩。

publicclassTest{

publicstaticvoidmain(String[]args){

Personp=newPerson(“Matrixx”,10);

Personp1=newPerson(“Matrixx”,10);

System.out.println(p.equals(p1));//输出:false

}

}

classPerson{

Stringname;

intage;

publicPerson(Stringname,intage){

this.name=name;

this.age=age;

}

}

虽然p与p1目标的特点值相同,但由于equals()默认比较的是目标的地址,所以回来false,假如想要在这种状况下回来true,需要在Person中重写equals()办法编写比较的逻辑。

hashCode()

回来此目标的哈希值(hashCode)

依据必定的规矩将与目标相关的信息(比如目标的存储地址,目标的字段等)生成一个数值,这个数值便是哈希值,可重写此办法定制生成哈希值的规矩,来避免两个目标的equals()相等但hashCode()不相等的状况。

一般来说,假如假如两个目标x和y满足x.equals(y)==true,它们的哈希值应当相同。Java对于eqauls()办法和hashCode()办法是这样规则的:

假如两个目标equals()办法比较相同(equals()办法回来true),那么它们的hashCode必定相同;

假如两个目标的hashCode相同,则它们并不必定相同。

所以当咱们重写了equals()办法保证x.equals(y)回来true时,需要重写一下hashCode(),保证hashCode()也要回来true。

当然,未必要按照要求去做,可是假如在运用有关hash表的数据结构存储这个目标的时分(比如HashMap,HashSet等),比如说HashSet,那就有可能在存储的时分存在两个相同的目标,一起添加新元素的功率会大大下降(对于运用哈希存储的系统,假如哈希值频频的冲突将会形成存取功能急剧下降)。

wait()

导致当时的线程等候,直到其他线程调用此目标的notify()办法或notifyAll()办法。

由于一切的Object都能够被用来作为同步目标,所以精确的讲,wait和notify是同步目标上的办法

只能在synchronized块中调用

同步目标:

ObjectsomeObject=newObject();

synchronized(someObject){

//此处的代码只要占有了someObject后才能够履行

}

synchronized表示当时线程,独占目标someObject当时线程独占了目标someObject,假如有其他线程企图占有目标someObject,就会等候,直到当时线程开释对someObject的占用。someObject又名同步目标,一切的目标,都能够作为同步目标。

开释同步目标的方式:synchronized块自然结束,或有异常抛出。

wait(longtimeout)

导致当时的线程等候,直到其他线程调用此目标的notify()办法或notifyAll()办法,或许超越指定的时间量。

wait(longtimeout,intnanos)

导致当时的线程等候,直到其他线程调用此目标的notify()办法或notifyAll()办法,或许其他某个线程中止当时线程,或许已超越某个实践时间量。

notify()

唤醒在此目标监视器上等候的单个线程。

同步目标的办法,参考wait(),只能在synchronized块中调用。

notifyAll()

唤醒在此目标监视器上等候的一切线程。

toString()

回来该目标的字符串表示,类名+@+十六进制目标地址。一般重写此办法用于查看目标的特点的内容。,java.lang.object类的方法有哪些,java是面向目标的语言,而Object类是java中一切类的尖端父类(根类)。

每个类都运用Object类作为超类,一切目标(包括数组)都完结这个类的办法,即便一个类没有用extends明确指出承继于某个类,那么它都默许承继Object类。

Object类中供给了许多办法,这里只取其间比较常用的办法做下简述。

1)publicStringtoString()>>>获取目标信息的办法

这个办法在打印目标时被调用,将目标的信息变为字符串回来,默许输出目标地址。

举个例子:

仿制代码

/**

*界说一个类并重写toString()办法

*/

publicclassPerson{privateStringname;privateintage;privatechargender;

@OverridepublicStringtoString(){return”Person{“+

“name=’”+name+’\”+

“,age=”+age+

“,gender=”+gender+

‘}’;

}publicPerson(){

}publicPerson(Stringname,intage,chargender){this.name=name;this.age=age;this.gender=gender;

}

仿制代码

仿制代码

/***测验类*/publicclassTest{publicstaticvoidmain(String[]args){

Personp1=newPerson(“张三”,22,’男’);

Personp2=newPerson(“李思”,23,’女’);

System.out.println(p1.toString());

System.out.println(p2.toString());

}

}

仿制代码

运转成果:与重写的toString()成果结构共同。

2)publicbooleanequals(Objectobj)>>>目标持平判别办法

该办法用于比较目标是否持平,而且此办法有必要被重写。

举个例子:

仿制代码

/***界说一个类并重写equals办法*/publicclassPerson{privateStringname;privateintage;privatechargender;publicPerson(){

}publicPerson(Stringname,intage,chargender){this.name=name;this.age=age;this.gender=gender;

}publicStringgetName(){returnname;

}publicvoidsetName(Stringname){this.name=name;

}publicintgetAge(){returnage;

}publicvoidsetAge(intage){this.age=age;

}publicchargetGender(){returngender;

}publicvoidsetGender(chargender){this.gender=gender;

}/***重写equals办法*/publicbooleanequals(Personp){returnsuper.equals(p);

}

}

/***测验类*/publicclassTest{publicstaticvoidmain(String[]args){

Personp1=newPerson(“张三”,22,’男’);

Personp2=newPerson(“张三”,23,’男’);

Personp3=newPerson(“张三”,22,’男’);

Integera=10;

Integerb=10;booleanflag1=p1.equals(p2);booleanflag2=p1.equals(p3);booleanflag3=p1.getName().equals(p2.getName());booleanflag4=a.equals(b);

System.out.println(flag1);

System.out.println(flag2);

System.out.println(flag3);

System.out.println(flag4);

}

}

运转成果:equals比较的是地址,即便p1和p3的各个特点相同,但是经过创立目标两者在堆中的地址值是不相同的,因而成果为false。

需要留意的是基本数据类型是没有equals办法的。上述事例中Integer换成int会报错,p1.getGender().equals(p2.getGender())也是不对的。

3)publicnativeinthashCode()>>>目标签名

该办法用来回来其所在目标的物理地址(哈希码值),常会和equals办法同时重写,确保两个持平的目标具有持平的.hashCode。

/***重写hashCode办法*/@OverridepublicinthashCode(){returnsuper.hashCode();

}

/***测验类*/publicclassTest{publicstaticvoidmain(String[]args){

Personp1=newPerson(“张三”,22,’男’);

Personp2=newPerson(“张三”,22,’男’);inti1=p1.getName().hashCode();inti2=p2.getName().hashCode();inti3=p1.hashCode();inti4=p2.hashCode();

System.out.println(i1);

System.out.println(i2);

System.out.println(i3);

System.out.println(i4);

}

}

运转成果:

由此可见经过new的目标即便特点赋值共同,目标的hashCode也是不相同的。

4)publicfinalnativeClassgetClass()>>>回来此Object的运转时类

留意:此办法不可重写,要调用的话一般和getName()联合运用,如getClass().getName()

该办法在反射中有大用!

5)线程中常用的办法(此处合在一起阐明)

publicfinalvoidwait()>>>多线程中等候功用

publicfinalnativevoidnotify()>>>多线程中唤醒功用

publicfinalnativevoidnotifyAll()>>>多线程中唤醒一切等候线程的功用

其间wait()办法还有另外两个带不同功用的办法:

publicfinalnativevoidwait(longtimeout)>>>要等候的最长时刻,单位毫秒

publicfinalvoidwait(longtimeout,intnanos)>>>nanos额外时刻,单位纳秒

6)protectednativeObjectclone()>>>protected修饰的办法,功用是完结目标的浅仿制(创立并回来此目标的一个副本—-“副本”的精确意义或许依赖于目标的类)

只需完结了Cloneable接谈锋可以调用该办法,否则抛出CloneNotSupportedException。

Java中除了8种基本类型传参数是值传递,其他的类目标传参数都是引用传递,我们有时候不希望在办法里将参数改变,这时就需要在类中复写clone办法(完结深仿制)。

7)protectedvoidfinalize()>>>废物收回(开释资源的办法)

该办法即便被调用也不知道什么时候执行,所以一般很少主动运用。

finalize()办法的用处:

不管目标是怎么创立的,废物收回器都会担任开释目标占据的一切内存。这就将对finalize()的需求限制到一种特殊状况,即经过某种创立目标的方式以外的方式为目标分配了存储空间。这种状况一般发生在运用“本地办法”的状况下,本地办法是一种在Java中调用非Java代码的方式。

*>>Java的一大特点便是废物收回机制。关于废物收回需要留意以下几点:

1)目标或许不被废物收回。

只需程序没有接近存储空间用完的那一刻,目标占用的空间就总也得不到开释。

2)废物收回并不等于“析构”。

3)废物收回只与内存有关。

运用废物收回的唯一原因便是为了收回程序不再运用的内存。

综上所述,Object类常用的六种办法是toString()、equals()、hashCode()、wait()、notify()、notifyAll()。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容

图片-小白之家
图片-小白之家