兩類數(shù)據類型
基本數(shù)據類型
byte,short,char,int,long,float,double,boolean引用數(shù)據類型
類,接口,數(shù)組,枚舉,注解
棧內存
存放內容
存放無static修飾的基本數(shù)據類型變量。
存放引用數(shù)據類型指向堆內存的引用地址。棧內存中數(shù)據的生命周期
調用函數(shù),進入函數(shù)作用域,執(zhí)行到創(chuàng)建變量的語句時,變量創(chuàng)建,被調用函數(shù)執(zhí)行結束,離開函數(shù)作用域,變量釋放。
for(//作用域){
//局部變量,隨域一次循環(huán)結束,釋放。
}
if(){
//作用域
}
Person p1 = new Person();
Person p2 = new Person();
p1 = p2;
//p1,p2即存放在棧內存中的引用地址,指向堆內存中開辟的對象空間。
//p1 = p2; 改變的是引用地址的指向(內存地址)。
//即p1在棧內存中的引用變?yōu)閜2,而不是堆內存中開辟的p2空間覆蓋p1空間。
new 做的三件事
1.在內存(堆內存)中開辟一塊空間。
2.在開辟的空間中創(chuàng)建對象。
3.調用對象的構造函數(shù)初始化對象。
堆內存
存放內容
存放所有類類型的對象。堆內存中數(shù)據的生命周期
當堆內存中的對象空間,沒有任何引用地址指向時,程序將無法訪問該對象,Java的垃圾回收機制(GC)將會回收,釋放該對象所占的內存區(qū)域。
方法區(qū)
靜態(tài)區(qū)
字符串常量池
成員變量與局部變量的區(qū)別
成員變量 | 局部變量 | |
---|---|---|
定義位置 | 當前類中 | 函數(shù)中 |
應用范圍 | 所在類中任何位置都有效 | 形參,函數(shù)作用域內 |
生命周期 | 跟隨對象創(chuàng)建,消失 | 跟隨作用域創(chuàng)建,消失 |
存儲位置 | 堆內存 | 棧內存 |
初始值 | 若new時沒有賦值,將賦默認值 | 無默認值,想使用必須指定賦初值 |
static
class Demo{
public static int sTest = 1;
public static String mStr = "Test log";
public static void test(){
只能調用靜態(tài)成員,不能用this,super,原因:靜態(tài)生命周期
System.out.println(mStr);
}
}
調用方式
public static void main(String[] args) {
Demo.test();
System.out.println(Demo.sTest);
}
注意
static可以修飾成員變量,內部類,但是不能修飾局部變量。原理
類(.class)文件通過加載鏈接裝載進內存,虛擬機會先驗證.class文件的字節(jié)流,確認包含的信息符合當前虛擬機的要求。
驗證結束進入準備階段,正式為類變量分配內存,并設置類變量的初始值,此時內存分配的僅包括被static修飾的類變量,不包括實例變量。
實例變量將會在對象實例化時隨著對象一起分配在堆中。
Java虛擬機類加載機制
- 靜態(tài)的生命周期
靜態(tài)變量隨著類的加載而存在,隨著類的消失而消失
final
class Demo{
final修飾的常量不會被初始化,必須手動賦初值,只能賦值一次
命名規(guī)則:所有字母都大寫,如果由多個單詞組成,單詞間通過 _ 連接。
final public static int S_TEST = 1;
final修飾的函數(shù)不能被繼承,重寫
final public static void test(){
System.out.println("Test log");
}
}
內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。