具體劃分爲五個內存空間
棧:存放的是局部變量
堆:存放的是所有new出來的東西
方法區:(類的方法,靜態等)
本地方法區:(和系統相關)
寄存器:(CPU使用)
局部變量:在方法定義中或者方法聲明上的變量都稱爲局部變量
int[] arr = new int[3]
System.out.println(arr);//地址值
System.out.println(arr[0]);// 0
System.out.println(arr[1]);// 0
System.out.println(arr[2]);// 0
棧 堆
new int[3]
int[] arr <------- 0x0001(地址)
0 0
1 0
2 0
堆內存的特點:
A:每一個new出來的東西都有地址值
B:每個變量都有默認值
byte,short,int,long 0
float,double 0.0
char '\u00000'
boolean false
引用類型 null
C:使用完畢就變成了垃圾,但是並沒有立即回收。會在垃圾回收器空閒的時候回收。
棧內存的數據用完就釋放掉。例如:
{int a = 100;
System.out.println(a);
}
2 數組動態初始化和靜態初始化
動態:
int[] arr = new int[3];
arr[0] = 1;
靜態:
int[] arr = new int[]{1,2,3}
簡化後:
int[] arr = {1,2,3}
3 數組操作的兩個常見小問題
編譯時不報錯,運行報錯
int[] arr = {1,2,3};
System.out.println(arr[3]);
//(ArrayIndexOutOfBoundsExceptin)數組索引越界異常越界
//原因:訪問了不存在的索引
arr = null;
System.out.println(arr[0]);
//(NullPointerException)空指針異常
//原因:數組已經不再指向堆內存了,而你還用數組名去訪問元素
作用:請自己把所用的場景Exception結尾的問題總結一下,以後遇到就記錄下來。
4 二維數組
A:
int[][] arr = new int[3][4];
arr[1][1] = 100;
B:
int[][] arr = new int[2][];
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[1][1] = 100;
C:
int[][] arr = {{1,2,3},{4,5},{6}};
5 一個對象的內存圖
6 成員變量和局部變量的區別
A:位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
B:內存中的位置不同
成員變量:在堆內存
局部變量:在棧內存
C:生命週期不同
成員變量:隨着對象的創建而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
D:初始化時不同
成員變量:有默認初始化值
局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用
注意事項:
局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,採用就近原則。
class Variable{
//成員變量
int num = 10;
//int num; //0
public void show(){
//int num2 = 20;//局部變量
//可能尚未初始化變量num2
//int num2; 沒有默認值
int num2 = 20;
System.out.println(num2);
int num = 100;
System.out.println(num); // 100 採用就近原則
}
}
7 匿名對象
就是沒有名字的對象
匿名對象的應用場景:
A:調用方法,僅僅只調用一次的時候。
注意:調用多次的時候,不適合。
那麼,這種匿名對象調用有什麼好處嗎?
1.匿名對象調用完畢就是垃圾,可以被垃圾回收器回收。
B:匿名對象可以作爲實際參數傳遞
//帶名字的對象
Student s = new Student;
s.show();
s.show();
//匿名對象
//new Student()
//匿名對象調用方法
new Student().show();
new Student().show();// 這裏其實是重新創建了一個新的對象
//匿名對象作爲實際參數傳遞
StudentDemo sd = new StudentDemo();
//Student ss = new Student();
//sd.method(ss);//這裏的s是一個實際參數
//匿名對象
sd.method(new Student());
//再來一個
new StudentDemo().method(new Student());
8 static
(所以感覺作用兩點,成員變量和成員方法)
(成員變量 被對象共享)
(成員方法 即不用建立對象而調用類的方法)
(可以修飾內部類,但主類不能)
(靜態方法只能訪問靜態成員)
(靜態方法不能被重寫,靜態變量是變量不是常量,可以被改變,對所有對象都有影響)
(目前看到的修飾:變量(成員變量和局部變量)、方法、代碼塊、內部類 )
針對多個對象有共同的這樣的成員變量,java提供了static
static的特點:(它可以修飾成員變量,也可以修飾成員方法)
A:隨着類的加載而加載
回想main方法。。。
B:優先於對象存在
C:被類的所有對象共享
舉例:我們班上的學生應該共用一個班級編號
如果某個成員變量是所有對象共享的沒那麼它就應該定義爲靜態的
D:可以通過類名調用
其實它本身也可以通過對象名調用
靜態修飾的內容一般我們稱其爲:與類相關的,類成員
9 main方法的格式講解
public static void main(String[] args)
public:公共的,訪問權限是最大的,由於main方法是被jvm調用,所以權限要夠大
static:靜態的,不需要創建對象,通過類名就可以,方便jvm的調用
void:因爲我們曾經說過,方法的返回值是返回給調用者的,而main方法是被jvm調用,返回給jvm沒有意義
main:是一個常見的方法入口,(我)見過的語言都是以main爲入口
String[] args:這是一個字符串數組,值去哪裏了?
這個東西到底有什麼用?怎麼給值?
這個東西早起是爲了接受鍵盤錄入的數據的
java MainDemo hello world
http://blog.csdn.net/yxmaomao1991/article/details/50507177