Java对象的内存分配及初始化

public class Square{
    private double length = 5.2D;
    private double width = 1.314D;
    private double area;
    public double getArea(){
        return length*width;
    }
}
public class TestSquare{
    public static void main(String[] args){
        Square s = new Square();
        s.getArea();
    }
}

1.程序开始运行时,TestSquare被类加载器加载进入内存,main方法由于是static方法首先pop到栈中;
2.接着就是new Square(),类加载器加载Square类,对类中的成员变量和方法进行初始化;
3.在栈中分配内存给对象的引用s,在堆中对Square类进行默认构造器的初始化,得到其存储地址赋值给引用s
4.引用s在调用getArea()方法时,通过隐藏的this指针,找到堆内存地址,返回area值;

描述图片

了解了这个以后,我们去看 == 和 equals 的区别更加明白了
1. == 对于对象而言,比较的是栈内存中的存放的对象地址,用来判断两个对象的地址是否相同,而对于基本类型来说,由于其存放的就是其内容,所以只要值相等就可以;
2. equals 比较的是两个对象的值是否相等,而不是物理地址,但是在Object方法中的equals一般都需要自己重写一下才能起到这个作用;
源码如下:

public boolean equals(Object obj) {
    return (this == obj);
}

在String,Integer等包装类中对其进行了重写,但是自己重写的时候依旧需要注意以下几点:
1. 自反性:对任意引用值X,x.equals(x)的返回值一定为true;
2. 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3. 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;
4. 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;
5. 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值