面向对象08-this的内存原理

本文详细解释了Java中的this关键字的作用,它用于区分成员变量和局部变量。通过内存图示例,展示了this如何代表方法调用者的地址值,以及在设置和获取成员变量(如通过setter和getter方法)时,this如何在堆内存中定位和操作数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. this关键字的作用和本质

  • this的作用:就是用来区分成员变量和局部变量的

  • this的本质:所在方法调用者的地址值

  1. 内存图从底层理解

1.简单的区分成员和局部

先来看两行代码

public class Student {
    private int age;
    public void method(){
        int age = 10;
        System.out.println(age);
        System.out.println(this.age);
    }
}
public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.method();
    }
}

首先是main方法先进栈然后执行main方法里面的第一行代码,这时候用到的是student类,会把student的字节码文件加载到方法区

Student s = new Student();

左边student s 会在堆内存中记录变量s,等号右边会有一个new关键字,会在堆内存中开辟一个空间,

由于之前只定义了一个age

 private int age;

所以在堆内存开辟的空间中只有一个age,除此之外还有成员方法的地址值,之后会把堆内存中的地址值赋值给占内存中的s变量

接下来运行method方法

调用者s记录的地址值就是001

this也是记录的001的地址值

this的本质:代表方法调用者的地址值

接下来在方法method中记录了age的值是10

sout(age)会触发就近原则,调用age=10;

this代表的是地址值,然后就会去堆内存中的那个地址找到age存储的值,然后就会把堆内存中存储的数据打印出来

2.含有set和get方法的内存图

先上代码

public class Student {
    private String name;
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
}
public class test {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("小橙");
        System.out.println(s.getName());
    }
}

首先程序执行main方法。main方法进栈 s 记录在堆内存中开辟的空间的地址值001

堆内存在new关键字的作用下开辟一个空间地址值是001,储存的默认的数据 nam = null;

这时内存图是这样子的

接下来执行setAge方法

此时会接受set赋值的“小橙”给name 。现在 name = “小橙”

this.name表示堆内存中的name null

this.name = name;

这个语句就会把“小橙”的数据,赋值给堆内存中的name记录的数据

此时的内存图是这样的

当再生成一个对象的时候,会开辟一个新的空间,过程也是和上面一样的,这里不再进行多的赘述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值