Java中创建对象时内存中的情况

public class Phone {
    public String brand;
    public double price;
    public String color; 
    
    public void call(String name) {
        System.out.println("给" + name + "打电话");
        }

    public void send() {
        System.out.println("我只是单纯的发信息而已");
    }

    //作用:调用该方法可以以字符串的形式打印出对象中对应的内容
    @Override
    public String toString() {
        return "Phone{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}


public class Iphone {
    public static void main(String[] args) {
        Phone p = new Phone();
        System.out.println(p);
//       结果: Phone{brand='null', price=0.0, color='null'}
        p.brand="华为";
        p.price=4399.0;
        p.color="red";
        System.out.println(p);
//       结果: Phone{brand='华为', price=4399.0, color='red'}
        p.call("任正非");
        p.send();

    }
}


1.Java内存中分为5个区域,这里主要讲述:栈,堆,方法区;
2.三大区域的主要作用:

1.栈中主要存放局部变量,执行方法的地方
2.堆中主要存放new出来的对象;
3.方法区中存放的是类的信息

3.程序的入口是主方法;

4.当执行主方法时,主方法入栈,开始执行主方法;

5.对象修改成员属性时

执行Phone p = new Phone()时;局部变量p存入栈当中,变量p中存放的堆中Phone类的对象的地址(0x333),new Phone()是在堆中创建一个Phone类的对象(设:地址为0x333);堆中对象存放的是方法区中类的属性和方法的地址;
当执行p.brand="华为"时;先通过变量p中存放的对象地址在堆中找到对象。然后对对象中的属性值进行改变;

6.对象调用方法时

当在堆中创建方法区中类对应的对象时,该对象中存放的是类的属性和方法的地址,成员方法不会随着属性一起复制到对象中,只是将成员方法的地址复制到对象当中;
当执行p.call(String name)方法时,先通过变量p的地址找到对应的对象,在对象中存储了方法区中成员方法的地址,通过地址找到方法区中的成员方法。然后压栈,使成员方法进入栈中执行,执行完毕后弹栈;

在这里插入图片描述7. 注意事项:

1. 类中的成员方法时存储在方法区当中的;堆中只是成员方法的地址
2. 当多个变量指向同一个对象时,如person p1 = p;将p变量中的内存赋值给p1,
  此时p1具备p中已经设置好的属性值;(p1.brand="华为"而不是null);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值