从头开始学JDK-------Object
目录
* Object #getClass
获取每个类的字节码文件。返回Class类。static synchronize的锁就是这个类的字节码文件Class对象
final方法,不能够被重写的方法
* 衍生 Class类可以用于反射创建无参的对象
List<String> classCreators = new ArrayList<>();
for (String classFullName : classNames) {
//根据类全名生成对象
Class<?> clazz = Class.forName(classFullName);
classCreators.add(clazz.newInstance());
}
* 衍生 判断某个类的Clazz是另外一个类的Clazz的衍生类
this.getClass()返回这个类的Class文件
field.getType()拿到的也是这个Field代表的对象的Class文件
private List<JRadioButton> getRadios() {
List<JRadioButton> radios = new ArrayList<>();
try {
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getType().isAssignableFrom(JRadioButton.class)) {
radios.add((JRadioButton) field.get(this));
}
}
} catch (Exception e) {
throw new IllegalArgumentException("获取组件上的Radio出错!!");
}
return radios;
}
* Object #hashcode
本地方法,public,高频重写的方法。为什么要使用String类的hashcode作为Key,因为String是不可变类,线程安全,并且hashcode在String类中有缓存功能,计算一次即可。
* Object #equals
public,高频重写的方法。默认比较的是两个对象的引用地址。
public boolean equals(Object obj) {
return (this == obj);
}
* Object #toString
源代码中默认展示了 类的全限定名,以及它的hashcode的十六进制表示。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
* Object #clone
本地方法,public。源代码注释上表示如果没有实现Cloneable接口,要求抛出异常。
根据面向对象的里氏替换原则,子类重写的时候应该要求返回一个原来对象的副本。源代码注释表示子类依旧可以抛出异常。
* Object #线程相关的方法
wait 、 notify 、notifyAll 都是final的,不得重写。操作的锁是调用的这个对象本身
* Object #垃圾回收
finalize ,protected属性,一般不重写,由JVM自己调用。为了迎合C++程序员做的方法。