java中object方法有哪些

发布时间:2024-06-02 点击:112
java中object方法有:1、【getclass()】是一个public的方法;2、【hashcode()】是一个public的方法,可以直接通过对象调用;3、【equals()】用于比较当前对象与目标对象是否相等。
相关免费学习推荐:java基础教程
java中object方法有:
一、引言
object是java所有类的基类,是整个类继承结构的顶端,也是最抽象的一个类。大家天天都在使用tostring()、equals()、hashcode()、waite()、notify()、getclass()等方法,或许都没有意识到是object的方法,也没有去看object还有哪些方法以及思考为什么这些方法要放到object中。本篇就每个方法具体功能、重写规则以及自己的一些理解。
二、object方法详解
object中含有:registernatives()、getclass()、hashcode()、equals()、clone()、tostring()、notify()、notifyall()、wait(long)、wait(long,int)、wait()、finalize()共十二个方法。这个顺序是按照object类中定义方法的顺序列举的,下面我也会按照这个顺序依次进行讲解。
1.1、registernatives()
public class object { private static native void registernatives(); static { registernatives(); }}什么鬼?哈哈哈,我刚看到这方法,一脸懵逼。从名字上理解,这个方法是注册native方法(本地方法,由jvm实现,底层是c/c 实现的)向谁注册呢?当然是向jvm,当有程序调用到native方法时,jvm才好去找到这些底层的方法进行调用。
object中的native方法,并使用registernatives()向jvm进行注册。(这属于jni的范畴,9龙暂不了解,有兴趣的可自行查阅。)
static jninativemethod methods[] = { {"hashcode", "()i", (void *)&jvm_ihashcode}, {"wait", "(j)v", (void *)&jvm_monitorwait}, {"notify", "()v", (void *)&jvm_monitornotify}, {"notifyall", "()v", (void *)&jvm_monitornotifyall}, {"clone", "()ljava/lang/object;", (void *)&jvm_clone},};为什么要使用静态方法,还要放到静态块中呢?
我们知道在类初始化的时候,会依次从父类到本类的类变量及类初始化块中的类变量及方法按照定义顺序放到< clinit>方法中,这样可以保证父类的类变量及方法的初始化一定先于子类。所以当子类调用相应native方法,比如计算hashcode时,一定可以保证能够调用到jvm的native方法。
1.2、getclass()
public final native class getclass():这是一个public的方法,我们可以直接通过对象调用。
类加载的第一阶段类的加载就是将.class文件加载到内存,并生成一个java.lang.class对象的过程。getclass()方法就是获取这个对象,这是当前类的对象在运行时类的所有信息的集合。这个方法是反射三种方式之一。
1.2.1、反射三种方式:
对象的getclass();
类名.class;
class.forname();class extends objecttest { private void privatetest(string str) { system.out.println(str); } public void say(string str) { system.out.println(str); }}public class objecttest { public static void main(string[] args) throws exception { objecttest = new (); //获取对象运行的class对象 class<? extends objecttest> aclass = .getclass(); system.out.println(aclass); //getdeclaredmethod这个方法可以获取所有的方法,包括私有方法 method privatetest = aclass.getdeclaredmethod("privatetest", string.class); //取消java访问修饰符限制。 privatetest.setaccessible(true); privatetest.invoke(aclass.newinstance(), "private method test"); //getmethod只能获取public方法 method say = aclass.getmethod("say", string.class); say.invoke(aclass.newinstance(), "hello world"); }}//输出结果://class test.//private method test//hello world反射主要用来获取运行时的信息,可以将java这种静态语言动态化,可以在编写代码时将一个子对象赋值给父类的一个引用,在运行时通过反射可以或许运行时对象的所有信息,即多态的体现。对于反射知识还是很多的,这里就不展开讲了。
1.3、hashcode()
public native int hashcode(); 这是一个public的方法,所以子类可以重写它。这个方法返回当前对象的hashcode值,这个值是一个整数范围内的(-2^31 ~ 2^31 – 1)数字。
对于hashcode有以下几点约束
在 java 应用程序执行期间,在对同一对象多次调用 hashcode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改;
如果两个对象 x.equals(y) 方法返回true,则x、y这两个对象的hashcode必须相等。
如果两个对象x.equals(y) 方法返回false,则x、y这两个对象的hashcode可以相等也可以不等。但是,为不相等的对象生成不同整数结果可以提高哈希表的性能。
默认的hashcode是将内存地址转换为的hash值,重写过后就是自定义的计算方式;也可以通过system.identityhashcode(object)来返回原本的hashcode。
public class hashcodetest { private int age; private string name; @override public int hashcode() { object[] a = stream.of(age, name).toarray(); int result = 1; for (object element : a) { result = 31 * result (element == null ? 0 : element.hashcode()); } return result; }}推荐使用objects.hash(object… values)方法。相信看源码的时候,都看到计算hashcode都使用了31作为基础乘数,为什么使用31呢?我比较赞同与理解result * 31 = (result<<5) – result。jvm底层可以自动做优化为位运算,效率很高;还有因为31计算的hashcode冲突较少,利于hash桶位的分布。
1.4、equals()
public boolean equals(object obj);用于比较当前对象与目标对象是否相等,默认是比较引

什么是企业建站?企业怎么申请免费网站?
哪里注册域名好?注册域名需要什么条件?
手机域名交易技巧有哪些?手机域名交易注意事项
企业品牌网站建设需要注意什么关键事项?
购买别人域名有什么好处
免费建站平台的注意事项有哪些?
还不知道跨境电商怎么做?一篇文章让你秒懂
类O2O概念产品交互设计的几点体会和探讨