Object类:
Object类是所有类的父类,所有都默认继承Object类,子类可以使用 Object 的所有方法。
Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。
构造方法
只有一个无参构造方法,并且没有静态常量
所有方法必须通过对象来调用
Object类的方法和使用
Object共有11个方法
(1).Class<?> getClass()
a.作用: 通过对象的该方法,可以获取对象的字节码对象
b.类加载的触发条件(使用类)
1.实例化对象 new
2.调用静态变量/静态方法
3.使用子类,加载父类
4.Class.forName(“全类名”) – jdbc
/*注册驱动 - 加载驱动 -> 加载类
驱动:其实也就是一个类,只是这个名字叫做驱动
这里需要的类,是mysql提供的实现类
Class.forName("驱动类名")
mysql: com.mysql.jdbc.Driver
oracle: oracle.jdbc.driver.OracleDriver
可能产生的异常:ClassNotFoundException
原因1: 没有导入jar包
原因2: 类名写错
*/
Class.forName("com.mysql.jdbc.Driver");
5.对象.getClass(获取文件路径)
//配置文件存在src下
InputStream is = Demo01.class.getClassLoader().getResourceAsStream("druid.properties");
(2).protected Object clone()
a.克隆的方式:
深克隆: 复制对象
浅克隆: 复制引用
b.调用
1.方法必须重写
2.必须要实现Cloneable接口,否则会抛出CloneNotSupportedException - 不支持的克隆异常
c.注意:
1.一般不会重写clone(),因为可以使用引用的赋值进行复制(此clone()为浅克隆).
2.Cloneable接口 - 是一个空接口,目的就是为了标记是可克隆的
(3)protected void finalize()
a.内存溢出和内存泄漏
内存溢出: 在内存中没有存储的地方
内存泄漏: 内存被无用的对象占用
[一个对象分配内存空间后,在使用结束时没有及时释放,导致一直都在占用内存,没有及时清除,使得实际的可使用内存在减少]
b.java存在垃圾回收机制 - gc
gc: 定时清理内存中的垃圾
1.垃圾: 没有引用的对象,被定成垃圾
2.可以手动调用 System.gc
注意: java原则上是不存在内存溢出和泄漏问题
(4) String toString()
a.作用: 将对象以字符串的形式输出
b.[默认实现]:
getClass().getName() + “@” + Integer.toHexString(hashCode())
@前: 全类名 -> 包名 + 类名
@后: 16进制的地址值
c.方法的重写
目的: 以自定义的方式展示对对象的显示
注意:
一般自己定义的类都会重写toString()
重写前,输出的是地址值
重写后输出的是自定义重写内容
(5) boolean equals(Object obj)
a.作用:判断两个对象[this 和 obj]是否相等
b.Object中的equals默认实现:
是判断两个对象的地址值是否相等
重写过后,判断两个对象的内容是否相等
c.重写的过程:
1.判断是不是同一种类型
2.判断是不是同一个对象
3.既不是同一个对象,也不是同一个类型的情况
(6)int hashCode() - 获取hash值 -指的是内存地址值
public native int hashCode();
native:本地 -> 底层下是c++实现的代码
注意:
一般在比较时会用到equals()和hashCode(),所以在自定义类的比较时,
要同时重写equals()和hashCode(),并且equals()和hashCode()比较对象要一致
不然在比较时容易出现问题(特别是在使用Map集合时)
(7) wait() * 3 / notify()/notifyAll() – 跟线程相关的
前者为等待,后者为唤醒(针对自己)
public void run() {
for (int j = 0; j < 3; j++) {
if (!food.isFinish) {
synchronized (food){
try {
//线程沉睡
food.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
for (int i = 1; i < food.number + 1; i++) {
System.out.println("顾客吃了" + i + "个" +food.kind);
}
System.out.println("包子卖完了");
food.number = 0;
food.isFinish = false;
synchronized (food){
//线程开启
food.notify();
}
}
}