7.java——Obiect内部类 equals方法和toString方法
1.所有的java类都必须继承于object类
object中没有声明任何属性
object类提供一个空参的构造器
object类中声明的方法
面试题:final ,finally,finalize区别
在Java中,final、finally和finalize是三个不同的概念。
1.final是一个关键字,可以修饰类、方法和变量。它的作用如下:
修饰类:final修饰的类是不可继承的,即无法派生出子类。
- 修饰方法:final修饰的方法是不可重写的,即子类无法覆盖该方法。
- 修饰变量:final修饰的变量是一个常量,其值无法被修改。
2.finally也是一个关键字,用于定义在try-catch语句中的一个代码块。无论是否发生异常,finally中的代码都会被执行。主要用于释放资源或者确保某些代码一定会被执行。
3.finalize是Object类中的一个方法,用于在垃圾回收器清理对象之前执行一些清理操作。通常情况下,不需要显式地调用finalize方法,垃圾回收器会在合适的时候自动调用该方法来清理对象。
简而言之: - final用于修饰类、方法和变量,分别表示不可继承、不可重写和不可修改。
- finally用于定义必须执行的代码块,无论是否发生异常。
- finalize是Object类中的方法,用于垃圾回收器清理对象前执行清理操作。
2.重点方法:equals( ) ,toString()
equals():———比较地址一样还是不一样,是否指向堆区同一块内存
equals()是Object类中定义的方法,在Java中所有类都是Object类的子类,因此所有的类都继承了equals()方法。equals()方法用于比较两个对象是否相等(如果地址相同,引用相同,则对象一定相同)。对于值类型(如int、float等),直接使用==运算符进行比较即可。而对于引用类型对象,相等指的是两个对象在逻辑上相等,即它们具有相同的属性和状态。默认的equals()方法是通过比较两个对象的内存地址来决定它们是否相等。如果自定义的类需要比较自身的属性,则需要重写equals()方法,通常需要覆盖hashCode()方法。
toString():
toString()方法返回一个表示该对象的字符串。在实际开发中,toString()方法是非常重要的。它可以将一个对象的属性值转换成字符串表示,方便输出或日志记录。默认情况下,toString()方法返回一个字符串,该字符串包含对象的类名及其哈希码。如果我们想要输出自定义的字符串表示,就需要重写toString()方法。在重写方法时,我们可以根据需要自由地组织各个属性的字符串表示形式,从而实现方便的输出。
在实际开发中,equals()和toString()是非常常用的方法。
equals()方法用于判断对象是否相等,而toString()方法则用于将对象属性的值转换成字符串形式进行输出、记录日志等。同时,需要注意重写这两个方法时需要遵循一定的规范,比如equals()方法需要满足自反性、对称性、传递性和一致性等性质,而toString()方法则应该返回具有可读性的表示字符串
equals()方法——比较引用数据类型的地址是否相等,引用是否指向同一片内存
运算符,正常就是比较数值,如果需要比较的对象类型不同且不支持隐式转换,则必须显式转换类型以进行比较。如果比较的是指针,则比较的是指向的内存地址是否相同,而不是它们所指向的数据内容。
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
1.运算符 在基本数据类型,判断数据值是否相等,使用范围基本数据类型
引用数据类型 基本数据类型就是 比数值 ,引用数据类型就是 比地址
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关键字——公共的,静态共用的,四个人寝室厕所公有没有必要独自开辟一份,但是床是私人要独立开辟的,
3.了解方法:clone(), finalize()
clone克隆——类克隆。类中内容一样,地址不一样
finalize ——重写的时候,对象销毁的时候你有什么遗言。scanner和close()
自己调用自己
4.目前不需要关注的是:getClass() ,hashCode() , notify(), notifyAll(), wait()
在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 代码块或方法中)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!