JVAM内存模型、Object对象及它的方法

本文详细探讨了Java内存模型中的JVAM概念,介绍了Object类的基础及其方法toString(), equals()和hashCode()的使用和重写。通过实例演示了如何定制对象的toString输出和比较逻辑。此外,还涵盖了final关键字在修饰类、方法和变量时的不同作用。
摘要由CSDN通过智能技术生成

JVAM内存模型

在这里插入图片描述

Object对象及它的方法

Object类是所有类的父类,我们的类没有extends Object,它都会默认继承Object
Object判有几个方法,所有的类都会继承这些方法,有需要的时候可以重写这些方法

  • toString()

    如果一个对象直接用于显示,它默认区调用toString(),把返回内容显示出来。

    对象toString()方法默认返回类的全限定名再加上对象的d,这个信息没有太大参考价值,所以我们常常重写类的toString()方法,返回属性的值

    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", name='" + name + '\'' +
                '}';
    }
    
  • equals() 和hashCode()

    hash是一种算法,根据一定的内容生成一个hash code值,用于判断两个内容是否一样
    equals()方法判断两个对象是否内容相等,它依赖hashCode()方法

@Override
public boolean equals(Object o) {
    //首先对比地址是否相同
    if (this == o) return true;
    //要比较对象是不是null,是null不用相等
    //getClass() != o.getClass()  判断两个类是不是同一个类创建的,如果不是肯定不相等
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return num == student.num && Objects.equals(name, student.name);
}

@Override
public int hashCode() {
    return Objects.hash(num, name);
}

测试代码

Student student = new Student();
student.setName("张三");
student.setNum(10086);
System.out.println(student);

Student student1 = new Student();
student1.setName("张三");
student1.setNum(10086);
System.out.println(student1);

//对象用 == 比较,比较的是它的地址
System.out.println(student == student1);
//用equals判断两个对象,equals方法返回true则两者相等
System.out.println(student.equals(student1));

== 与 equals

基本类型判断是否相等用 ==

引用(对象)类型用==判断,只是判断对象的地址,如果相等,说明是指向堆中的同一个对象
逻辑上判断两个对象是否相等,需要用equals方法,往往需要重写equals

注意:字符串的字面量赋值时不会生成对象,而是存放在常量池,常量池中的字符串可以共享

short s = 65;
int i = 5;
char c = 'A';
//基本类型用==比较,它是比较的值,和类型美哦有关系
System.out.println(s == i);
System.out.println(i == c);

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); //false
System.out.println(str1.equals(str2));

String str3 = "xyz";
String str4 = "xyz";
//字面量赋值的字符串保存在常量池,并不会创建一个对象
System.out.println(str3 == str4);
System.out.println(str3.equals(str4));

getClass()

返回类的class类型对象

每一个类加载到方法区时都会生成一个calss类型的对象,这个对象负责访问类的字节码

finalize()

gc(垃圾回收器)回收对象之前会调用的一个方法

notify及wait等方法

这些方法是多线程时要使用的

final()

flag意思是最终的,它也是修饰符,它可以修饰类、成员变量、方法

  • 修饰属性

    1. 修饰成员变量时要赋值,static final修饰的成员变量就是常量
    2. 修饰局部变量,可以先定义再赋值
    3. 不管时修饰哪一种变量,只能被赋值一次,再也不能被修改
    public class Parent {
        public static final float pi = 3.14f;
        public static int count;
        private int num;
    
        //final 的成员变量必须要初始化
        //final的变量不能再被赋值(值初始化后不能再改变)
        public final int flag = 0;
        public static void area(float r){
            System.out.println(pi * r *r);
        }
        
        public int getNum() {
            final int i;
            i = 2;
            System.out.println(i);
            System.out.println(flag);
            return num;
        }
          
    
  • 修饰方法

    final修饰的方法不能被重写

public final void test(){
    
}
  • 修饰类

    final修饰的类不能被继承

public final class Parent{ }

+ 修饰方法

final修饰的方法不能被重写

```java
public final void test(){
  
}
  • 修饰类

    final修饰的类不能被继承

public final class Parent{ }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值