object中没有声明任何属性
object类提供一个空参的构造器
object类中声明的方法
面试题:final ,finally,finalize区别
在Java中,final、finally和finalize是三个不同的概念。
修饰类:final修饰的类是不可继承的,即无法派生出子类。
equals()是Object类中定义的方法,在Java中所有类都是Object类的子类,因此所有的类都继承了equals()方法。equals()方法用于比较两个对象是否相等(如果地址相同,引用相同,则对象一定相同)。对于值类型(如int、float等),直接使用==运算符进行比较即可。而对于引用类型对象,相等指的是两个对象在逻辑上相等,即它们具有相同的属性和状态。默认的equals()方法是通过比较两个对象的内存地址来决定它们是否相等。如果自定义的类需要比较自身的属性,则需要重写equals()方法,通常需要覆盖hashCode()方法。
toString()方法返回一个表示该对象的字符串。在实际开发中,toString()方法是非常重要的。它可以将一个对象的属性值转换成字符串表示,方便输出或日志记录。默认情况下,toString()方法返回一个字符串,该字符串包含对象的类名及其哈希码。如果我们想要输出自定义的字符串表示,就需要重写toString()方法。在重写方法时,我们可以根据需要自由地组织各个属性的字符串表示形式,从而实现方便的输出。
在实际开发中,equals()和toString()是非常常用的方法。
equals()方法用于判断对象是否相等,而toString()方法则用于将对象属性的值转换成字符串形式进行输出、记录日志等。同时,需要注意重写这两个方法时需要遵循一定的规范,比如equals()方法需要满足自反性、对称性、传递性和一致性等性质,而toString()方法则应该返回具有可读性的表示字符串
运算符,正常就是比较数值,如果需要比较的对象类型不同且不支持隐式转换,则必须显式转换类型以进行比较。如果比较的是指针,则比较的是指向的内存地址是否相同,而不是它们所指向的数据内容。
public class Equals {
public static void main(String[] args) {
C C1= new C();
C C2= new C();
'区分 == 和equals'
System.out.println(C1.equals(C2)); //false
System.out.println(C1==C2); // false
String s1="abc";
String s2="abc";
String s3=new String("abc");
String s4=new String("abc");
System.out.println(s1.equals(s2)); //true s1==s2
System.out.println(s1==s2);// true
System.out.println(s3==s4); //false
System.out.println(s1==s3); //false
//下面三组都相等
int i=10;
int j=10;
char c1='A';
int i1=65;
float f1=12.0f;
int i4=12;
System.out.println(i==j);
System.out.println(c1==i1);
System.out.println(f1==i4);
//equals是个方法,只能使用在引用数据类型上,数组也可以用的上
int[]arr =new int[10];
System.out.println(arr.equals(new int[10]));
}
}
toString()
在我们平时调用System.out.println打印变量对象的时候就已经调用了toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
import java.awt.*;
import java.io.File;
public class Main {
public static void main(String[] args) {
User u1=new User(1,"zs");
System.out.println(u1.toString()); //User@3b07d329
System.out.println(u1);//User@3b07d329,打印地址
String s1 =new String("hello");//hello
System.out.println(s1.toString());
File f1=new File("asd");
System.out.println(f1.toString()); //asd
}
}
toString()主要还是返回对象属性的数据
public String toString()
{
return "User[color= " +color +", weight="+
weight+"]";
}
拓展static关键字——公共的,静态共用的,四个人寝室厕所公有没有必要独自开辟一份,但是床是私人要独立开辟的,
clone克隆——类克隆。类中内容一样,地址不一样
finalize ——重写的时候,对象销毁的时候你有什么遗言。scanner和close()
自己调用自己
在Java中,getClass(), hashCode(), notify(), notifyAll() 和 wait() 是一些对象的基本方法,它们都定义在 java.lang.Object 类中,这意味着所有Java类的实例都可以调用这些方法。
getClass()
这是一个实例方法,用于获取当前对象所属的类引用。返回值是 Class<?> 类型的对象,该对象描述了此对象的类信息。
Object obj = new MyClass();
Class<?> clazz = obj.getClass();
hashCode()
这个方法返回一个整数值,它代表对象的哈希码(hash code)。每个对象都有唯一的哈希码(在理想情况下),且相同的对象应该具有相同的哈希码。这个方法主要用于基于哈希的数据结构如HashMap和HashSet,以确定对象的位置或比较对象是否相等。
int hashCodeValue = obj.hashCode();
notify()
这是一个线程同步方法,用于唤醒在此对象监视器上等待的一个线程(如果有多个线程在等待,则会选择其中一个随机唤醒)。在多线程编程中,当一个线程进入某个对象的 synchronized 方法或代码块并调用了 wait() 方法后,它会释放对该对象监视器的所有权并进入等待状态,直到其他线程调用 notify() 或 notifyAll() 唤醒它。
synchronized (this) {
// ...
this.notify(); // 唤醒在此对象监视器上等待的一个线程
}
notifyAll()
同样是一个线程同步方法,但与 notify() 不同的是,notifyAll() 会唤醒在此对象监视器上等待的所有线程。
java
synchronized (this) {
// ...
this.notifyAll(); // 唤醒在此对象监视器上等待的所有线程
}
wait()
此方法使当前线程进入等待状态,直到其他线程调用此对象的 notify() 或 notifyAll() 方法,或者等待指定的时间间隔结束。wait() 方法必须在 synchronized 方法或代码块中被调用,否则将抛出 IllegalMonitorStateException 异常。
java
synchronized (this) {
try {
this.wait(); // 当前线程进入等待状态
} catch (InterruptedException e) {
// 处理中断异常
}
}
注意:使用这些方法时要特别小心,因为它们涉及线程同步和对象监视器的概念,不当的使用可能会导致死锁、线程饥饿等问题。同时,在调用 wait()、notify() 和 notifyAll() 方法前,通常需要先获得对象的锁(即处于 synchronized 代码块或方法中)。