6.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)。每个对象都有唯一的哈希码(在理想情况下),且相同的对象应该具有相同的哈希码。这个方法主要用于基于哈希的数据结构如HashMapHashSet,以确定对象的位置或比较对象是否相等。

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 代码块或方法中)。

你可能感兴趣的:(java,jvm,开发语言)