第5天----變數,過載,記憶體,陣列
阿新 • • 發佈:2018-12-11
昨天知識總結:
- 1.流程控制語句
- for
- while
- dowhile
- 迴圈例項
- break,continue
- 標記
- 2.函式
- 函式的由來
- 函式的構成
- 函式的優化
全域性變數和區域性變數
- 全域性變數和區域性變數
- 全域性變數:一般我們把直接定義在類中的變數稱為全域性變數
- 區域性變數:我們將定義在函式,for,if等內部的變數及形參稱為區域性變數
- 注意:在一個類的內部我們能直接看到的只有全域性變數的定義和函式的定義
- 生命週期:從定義當前的變數開始,到變數被銷燬的過程
- 作用域:在生命週期內變數可以起作用的範圍
- 全域性變數的作用域:整個類,除了static修飾的方法。
- 區域性變數的作用域:從定義當前的變數開始到他所在的函式,for,if等結束.
- 當變數的生命週期結束的時候,、意味著變數被釋放了
- 區別:
- 1.作用的範圍不同
- 2.預設值:全域性變數如果沒有賦值,系統會給預設值----0或null
- 區域性變數必須先賦值後使用
public class demo2 {
int a;//全域性變數
public static void main(String[] args) {
int b;//區域性變數
for(int i=0;i<10;i++) {//區域性變數
int c;//區域性變數
}
}
public void test(int x) {//區域性變數
int y;//區域性變數
}
}
過載
- 過載:對於同一個類中的函式,函式名字相同,關係不相同,我們將他的關係成為過載
- 為什麼可以同名?在程式的內部真正識別函式時,識別的是函式名+所有引數的型別
- 過載的函式本質上是不同的函式
- 總結注意點:
- 1.函式名必須相同
- 2.引數必須不同(型別,個數,位置),但是與引數的名字無關
- 3.過載與返回值無關
- 作用:簡化程式碼,方便我們進行操作
//第一個
//求兩個數的和
public static int sum(int a,int b) {
int sum = a+b;
return sum;
}
//第二個:與第一個 是過載,引數的個數不同
public static int sum(int a,int b,int c) {
int sum = a+b+c;
return sum;
}
//第三個:與第一個不是過載,過載與引數的名字無關
// public static int sum(int c,int d) {
// int sum = a+b;
// return sum;
//}
//第四個:與第一個是過載 引數的型別不同
public static int sum(float a,int b) {
return 3;
}
//第五個:與第四個是過載,引數的位置不同
public static int sum(int a,float b) {
return 3;
}
//第六個:與第四個不是過載,是相同的函式,叫做錯誤
// public static int sum(float a,int b) {
// return 3;
//}
java中的記憶體分類–棧區和堆區
- java記憶體分成五大塊:堆區,棧區,方法區,本地方法區,暫存器
- 棧區:存放資料的特點是先進後出,存放的資料是區域性變數和函式的載入,使用完立即釋放,
- 堆區:存放的是實體(陣列和物件),可以同時儲存多個數據,實體內部的變數如果不賦值,會被賦值成0
- 瞭解:堆中的資料會在某個時刻被釋放----通過垃圾回收機制
- 垃圾回收機制通過一個執行緒控制,這個縣城等級比較低,不會立即被釋放
陣列
- 陣列:用來儲存資料的
- 解釋:是一種引用資料型別,可以同時儲存多個相同型別的資料
- 簡單資料型別和引用資料型別的對比
- 1.都是存的數
- 2.簡單資料型別是直接儲存的普通的值,引用資料型別儲存的是地址
- java將陣列第一個中第一個元素的地址,當做陣列地址
- 特點:
- 1.陣列的記憶體空間是連續的,
- 2.陣列內的元素如果沒有賦值會有預設值,對於簡單資料型別的元素會賦值0或false
- 缺點:陣列這塊空間一旦被開闢出來就不能被改變
- new:每new一次會在堆中開闢一塊兒新空間,兩個陣列之間沒有任何關係,互不影響
- 構成:new+元素的型別+[元素的個數]
- new的功能:
- 1.在堆內開闢一片空間
- 2.將當前陣列的地址返回,java將陣列第一個中第一個元素的地址,當做陣列地址
- int[3]:中的int,我們存的是什麼型別的值,這裡就寫什麼型別。
- =前面的int[]是一個整體,代表int型陣列這種型別
- arr中儲存的是陣列的地址,arr就是資料儲存型別
- 注意點:
- ArrayIndexOutOfBoundsException: 陣列下標越界異常,下標超出了正常的範圍
public static void main(String[] args) {
//建立變數
int a = 3;
//例項:建立一個可以裝3個int型的值得陣列
int[] arr = new int[3];
//建立一個裝著6個float型的值的陣列
float[] arr1 = new float[6];
//賦值/取值--通過下標實現
//寫法構成:陣列的名字+[下標]
arr[0] = 3;//取arr中小標為0的元素並賦值成三
arr[1] = 4;
arr[2] = 6;
System.out.println(arr[0]);
//遍歷:把陣列當中中的值都列印了一遍
//arr.lengh:獲取的是陣列的長度,陣列元素的個數
//注意:下標比元素個數少一
for(int i = 0;i < arr.length;i++) {
System.out.println("遍歷"+arr[i]);
}
//其他的建立數字租的方式
//第一種:在建立陣列的同時完成初始化,{}中的數的個數就是元素的個數,前面的[]不能寫數
int[] arr3 = new int[]{3,4,5};
//第二種:這樣只是我們寫的時候更加簡單,但在內部會自動的new
int[] arr4 = {4,5,6,8};
//例項:求三個數的最大值
getMax(3,4,6);
int[] arr5 = {3,5,1,6};
getMax(arr5);
//getMax({4,4,6});不允許直接將{}的形式作為引數
getMax(new int[] {4,5,6});
}
//例項:求第三個數的最大值,-通過函式
public static int getMax(int a,int b,int c) {
//第二種方式:三目運算子
int max1 = a > b?a:b;
int max2 = max1 > c?max1:c;
return max2;
}
//例項:求三個數的最大值-通過函式
public static int getMax(int[] arr) {
int temp = arr[0];
float a = 0;
for(int i = 0;i < arr.length;i++) {
if(arr[i] > temp) {
temp = arr[i];
}
}
return temp;
}
值傳遞和址傳遞
- 值傳遞不會改變函式外面的值
- 址傳遞可以改變函式外面的值
public static void main(String[] args) {
//交換兩個數的值
int[] arr1 = {3,4};
//傳的是普通的值
exchange(arr1[0],arr1[1]);
System.out.println("arr1[0]"+arr1[0]+" arr1[1]"+arr1[1]);//3,4
//傳的是地址
int[] arr2 = {3,4};
exchange(arr2);
System.out.println("arr2[0]"+arr2[0]+" arr2[1]"+arr2[1]);//4,3
//傳的是地址
int[] arr3 = {3,4};
exchange1(arr3);
System.out.println("arr3[0]"+arr3[0]+" arr[1]"+arr3[1]);//3,4
}
//傳的是普通的值-------值傳遞
public static void exchange(int a,int b) {
int temp = 0;
temp = a;
a = b;
b = temp;
}
//傳的是地址------址傳遞
public static void exchange(int[] arr) {
int temp = 0;
temp = arr[1];
arr[1] = arr[0];
arr[0] = temp;
}
//傳的是地址----址傳遞
//注意:地址傳遞時,如果函式內部的引用重新進行了指向函式內部不能改變外部的值
public static void exchange1(int[] arr) {
int[] arr1 = new int[] {7,8};
arr = arr1;
int temp = 0;
temp = arr[1];
arr[1] = arr[0];
arr[0] = temp;
}