類和對象的創建及使用,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、特徵:匿名對象只能用一次

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