内存分析
对象创建内存分析
程序运行把class文件加载到内存Test.class,Cake.class,CakeMaker.class
虚拟机调用Test类的main方法进栈执行
逐行执行主方法里的代码
Cake cake = new Cake();先执行代码右边的,然后赋值给代码左边
看到new就是创建对象
1、在堆里为这个对象开辟内存空间,这个类的成员属性会跟随这个类进入内存空间,并附默认值。
2、把对象在堆内存的地址返回给引用
cake.color = “红色的”;
cake.shape=“圆形的”;
cake.taste=“甜甜的”;
跟随cake中存放的地址找到堆内存这个空间的color,shape,taste属性然后进行赋值。
cakeMaker.makeCake(cake);调用方法入栈,然后把cake实参传入方法中
根据cake的地址找到color、shape、taste的值
方法执行完毕弹栈释放内存
静态和成员变量区别
static 关键字
静态的,是一个成员修饰符,只能修饰成员,不能修饰局部
修饰变量: 静态变量|类变量
修饰方法: 静态方法|类方法
静态内容的使用方式:
1.对象使用
引用名.静态变量名
引用名.静态方法名()
2.通过类名使用
类名.静态变量名
类名.静态方法名()
成员都是属于对象的,静态的内容是属于类的
静态的变量在静态区中存在,是独一份的,所有对象共享的资源,在类第一次加载之后就初始化了
成员的变量在对象的内存空间中,跟随对象存在的,有一个对象就有一份成员
this不能在static修饰的方法中使用
静态的内容中只能直接使用静态的内容,不能直接使用成员的内容,但是可以通过对象使用
成员内容中可以直接使用静态的可以直接使用非静态的内容
this关键字
public class Cake {
public String shape; //形状
public String color;
public String taste;
public Cake(){
}
public Cake(String shape,String color){
this.shape = shape;//this指当前对象
this.color = color;
}
public Cake(String shape,String color,String taste){
this(shape,color);//调用本类中的其他构造器,使用参数列表进行区分
this.taste = taste;
}
@Override
public String toString(){
return this.shape+"--"+this.color+"--"+taste;this默认指代当前调用成员方法的对象
}
}
- 构造器的首行调用本类中的其他构造器。
:this(参数列表);注意:必须用在构造器首行才可以,构造器之间不能相互调用。 - 区分同名变量问题。
this存储这个对象的地址,在成员方法中,this指代当前调用这个成员方法的对象,如果出现同名变量的问题,想要指代成员变量必须使用this
如果不存在同名问题,this可以省略,在构造器中,this指代当前new的对象 注意: this和static不能同时使用。