JavaSE笔记6.4-面向对象-对象的初始化&调用过程

class Person
{
     
	private String name = "hah";
	private int age;
	private static  String country = "cn";
	Person(String name,int age)
	{
     
		this.name = name;
		this.age = age;
	}
	
	{
     
		System.out.println(name+".."+age);
	}
	public void setName(String name)
	{
     
		this.name = name;
	}

	public void speak()
	{
     
		System.out.println(this.name+"..."+this.age);
	}

	public static void  showCountry()
	{
     
		System.out.println("country="+Person.country);
	}
}

class  PersonDemo
{
     
	public static void main(String[] args) 
	{
     
		Person p = new Person("zhangsan",20);
		p.setName("lisi");
		Person p1=new Person("ahah",90);
	}
}

一. 对象的初始化过程

Person p = new Person("zhangsan",20);

该句话都做了什么事情?

  1. 因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中。
  2. 执行该类中的静态代码块(如果有的话),给Person.class类进行初始化。
  3. 在堆内存中开辟空间,分配内存地址。
  4. 在堆内存中建立对象的特有属性,并进行默认初始化(例:null和0)。
  5. 对属性进行显示初始化(例:hah)。
  6. 对对象进行构造代码块初始化。
  7. 对对象进行相应的构造函数初始化(例:Zhangsan和20)。
  8. 将内存地址赋给栈内存中的p变量。
    JavaSE笔记6.4-面向对象-对象的初始化&调用过程_第1张图片

二. 对象调用成员过程

Person p = new Person("zhangsan",20);
p.setName("lisi");
  1. 方法区:优先于对象存在,随着类的加载而加载;存放着static变量、方法信息。
    JavaSE笔记6.4-面向对象-对象的初始化&调用过程_第2张图片
  2. setName方法是对象特有的方法,被调用时要在栈中开辟空间;并且非静态的成员都有this引用;把变量p的值赋给this,this就指向对象。
    JavaSE笔记6.4-面向对象-对象的初始化&调用过程_第3张图片
  3. 当p.setName(“lisi”)执行完,栈内存中的setName被释放
    JavaSE笔记6.4-面向对象-对象的初始化&调用过程_第4张图片
    JavaSE笔记6.4-面向对象-对象的初始化&调用过程_第5张图片

你可能感兴趣的:(JavaSE,面向对象,初始化,调用,方法区)