public class Object {
//本地方法,C/C++在DLL中实现,通过JNI调用
private static native void registerNatives();
//类初始化调用此方法
static {
registerNatives();
}
//返回此Object的运行时类(每个类的Class类对象)
public final native Class<?> getClass();
//获得该对象的hash值
public native int hashCode();
//对比两对象的内存地址,如果不重写,equals方法比较的是对象地址
public boolean equals(Object obj) {
return (this == obj);
}
//本地clone方法,用于对象的赋值
protected native Object clone() throws CloneNotSupportedException;
//返回对象的的字符串表示,默认是:类名+@+hash值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
//notify()/notifyAll()/wait()以及wait两个重载方法都是线程同步相关方法
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
//对象被回收时调用,不管如何,一个对象只调用一次
protected void finalize() throws Throwable { }
public Object(){}
class A{}
class B extends A{}
class C extends B{}
A a = new C();//对象new C()的静态类型是A,动态类型是C
B b = (B)a;//引用b指向的还是new C(),动态类型还是C
C c = (C)b;
System.out.println(a.getClass().getName());
System.out.println(b.getClass().getName());
System.out.println(c.getClass().getName());
//打印结果均是:com.xxx.test.C
//对象的动态类型是不会变的,即new后面那个类型(构造对象的那个类型),但是静态类
//型是由指向它的引用决定的,事实上可以这样理解对象只有动态类型,引用类型才是静态类型
//以上说的对象指的是堆里对象,而不是泛指Object o = new Object()中的o
//不明白静态类型,动态类型的可以自行百度
//如何重写equals方法实现判断内容相等?
//关键点取决于你的逻辑,你想让两个对象在什么时候相等,你逻辑上就怎么写
class A {
public int a;
public String b;
public D d;
@Override
public boolean equals(Object o) {
if (this == o) return true;//如果指向同一个对象,当然equals
//如果o为null或两个对象类型都不相同,当然不equals
if (o == null || getClass() != o.getClass()) return false;
//动态类型相同,强制转换
A a1 = (A) o;
/*下面是自己的逻辑,判断两个对象是否相同,逻辑1 Begin*/
if (a != a1.a) return false;
if (b != null ? !b.equals(a1.b) : a1.b != null) return false;
return d != null ? d.equals(a1.d) : a1.d == null;
//全部字段相同,则equals。如果对象越复杂,想要实现全部字段相同,也就越复杂
/* 逻辑1 End */
/* 逻辑2 begin*/
//只要字段a相同,就认为两个对象equals
if(a == a1.a) return true;
/* 逻辑2 end*/
}
@Override
public int hashCode() {
int result = a;
result = 31 * result + (b != null ? b.hashCode() : 0);
result = 31 * result + (d != null ? d.hashCode() : 0);
return result;
}
}
class D{
public int a;
}
class A{}
A a = new A();
a.clone();//报错,即抛CloneNotSupportedException异常
class A implements Cloneable{}//这样才不会
//但,若你重写clone方法,并且在这个方法中没有调用父clone(也就是Object)方法
class A{
@Override
public Object clone() throws CloneNotSupportedException{
return new A();
}
}
a.clone();//这个时候调用clone方法即使没有实现Cloneable方法也不会报错
//说白了,你要理解为什么调用clone方法要实现Cloneable的原因,而不是仅仅是记住
//当你理解了,你就能熟练掌握这些规则,而不是记住他们
class D{
public static D d111;
@Override
protected void finalize() throws Throwable {
super.finalize();
d111 = this;//这个时候该对象第一次回收将失败,而以后将不会在执行该方法
System.out.println("finalize a = " + this.a);
}
}
D d = new D();
d = null;
//程序结束
//这个时候,虽然程序结束了,new D()对象也是可回收对象了,但是并不会执行
//finzlize,因为对于JVM来说GC的触发条件是内存不足,所以不会执行GC也就不会调用
//finzlize方法
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有