类和对象的创建及使用,JVM内存结构与对象的内存解析,匿名对象

类和对象的创建及使用

类和对象的使用(面向对象思想落地的实现):
1.创建类,设计类的成员
2.创建类的对象
3.通过“对象.属性”或“对象.方法”调用对象的结构

先创建一个类,再创建person类的对象,并且调用。

public class PersonTest {
	public static void main(String[] args) {
	
	//2. 创建Person类的对象
		Person p1 = new Person();//过程是固定的
		//Scanner scanner = new Scanner(System.in);这一种也是叫做创建类的对象
		//总结:创建类的对象 = 类的实例化 = 实例化类
		
		//调用对象的结构:属性、方法
		//调用属性:“对象.属性”
		p1.name = "Tom";//给变量赋值
		p1.isMale = true;
		System.out.println(p1.name);//调用值。
		
		//调用方法:“对象.方法”
		p1.eat();//在这里就可以调用eat方法
		p1.sleep();
		p1.talk("Chinese");//这里的Chinese传给了方法中的talk,即language会变成Chinese输出。	
	}
}

	//1.创建类,设计类的成员
class Person{
	
	//属性
	String name;
	int age = 1;
	boolean isMale;
	
	//方法
	public void eat(){
		System.out.println("人可以吃饭");
	}
	
	public void sleep(){
		System.out.println("人可以睡觉");
	}
	
	public void talk(String language){
		System.out.println("人可以说话,使用的是:" + language);
	}
	
}

类的多个对象的关系

public class PersonTest {
	public static void main(String[] args) {
		//2. 创建Person类的对象
		Person p1 = new Person();
		//Scanner scanner = new Scanner(System.in);
		
		//调用对象的结构:属性、方法
		//调用属性:“对象.属性”
		p1.name = "Tom";
		p1.isMale = true;
		System.out.println(p1.name);
		
		//调用方法:“对象.方法”
		p1.eat();
		p1.sleep();
		p1.talk("Chinese");
		
		//*******************************
		Person p2 = new Person();
		System.out.println(p2.name);//此处输出的是null,因为又新建了一个对象,所以在堆空间中有两个对象。
		System.out.println(p2.isMale);
		
		//*******************************
		
		Person p3 = p1;
		//将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体。
		System.out.println(p3.name);//所以此时输出的是Tom
	
		p3.age = 10;
		System.out.println(p1.age);//输出的是10,修改p3,其实就是修改p1
		
	}
}

//1.创建类,设计类的成员
class Person{
	
	//属性
	String name;
	int age = 1;
	boolean isMale;
	
	//方法
	public void eat(){
		System.out.println("人可以吃饭");
	}
	
	public void sleep(){
		System.out.println("人可以睡觉");
	}
	
	public void talk(String language){
		System.out.println("人可以说话,使用的是:" + language);
	}
	
}

总结:如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。

JVM内存结构与对象的内存解析:

在这里插入图片描述
编译完源程序后,生成一个或多个字节码文件。
我们使用JVM中的类和解释器对生成的字节码文件进行

堆(Heap):

此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。

方法区(MethodArea):

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法中的变量都是局部变量

对象的内存解析

内存解析的说明:

引用类型的变量,只可能储存两类值:null 或地址值(含变量的类型)

用上面的部分代码举例说明:

Personp1=newPerson();p1.name = "Tom";
p1.isMale =true;
Person p2 =new Person();sysout(p2.name);//null
Person p3 = p1;p3.age = 10;

第一行代码内存解析:
在这里插入图片描述

第二、三行代码
在这里插入图片描述

第四行代码
在这里插入图片描述
第五行输出的是null

第六行代码

在这里插入图片描述

第七行代码
在这里插入图片描述

匿名对象

1、引用类型的变量,没有显示的赋值给一个变量。即为匿名对象
2、特征:匿名对象只能用一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章