dataType[] arrayRefVar;
(推薦的方式)dataType arrayRefVar[];
**Tip:建議使用 dataType[] arrayRefVar 的聲明風格聲明數組變量。 dataType arrayRefVar[] 風格是來自 C/C++ 語言 **java
arrayRefVar = new dataType[arraySize];
int[] array1 = new int[]{1, 2, 3};
(靜態初始化)int[] array1 = {1, 2, 3};
(類型推斷)String[] array2 = new String[3];
(動態初始化,數組的初始化和數組元素的的賦值操做分開進行)array[number]
可使用下標的方式對數組內部數據進行賦值和讀取操做代碼示例c++
package study1; public class a { public static void main(String[] args) { int[] a = {1, 2, 3, 4, 5}; for(int i : a){ System.out.println(i); } } }
java虛擬機對內存區域的劃分算法
堆(Heap)shell
方法區(Method Area)編程
程序計數器(Program Counter Register)設計模式
虛擬機棧(JVM Stacks)數組
虛擬機棧線程私有,生命週期與線程相同。安全
棧幀(Stack Frame)是用於支持虛擬機進行方法調用和方法執行的數據結構。棧幀存儲了方法的局部變量表、操做數棧、動態鏈接和方法返回地址等信息。每個方法從調用至執行完成的過程,都對應着一個棧幀在虛擬機棧裏從入棧到出棧的過程。數據結構
圖示解析多線程
局部變量表(Local Variable Table)是一組變量值存儲空間,用於存放方法參數和方法內定義的局部變量。包括8種基本數據類型、對象引用(reference類型)和returnAddress類型(指向一條字節碼指令的地址)。
其中64位長度的long和double類型的數據會佔用2個局部變量空間(Slot),其他的數據類型只佔用1個。
若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常;若是虛擬機棧動態擴展時沒法申請到足夠的內存時會拋出OutOfMemoryError異常。
操做數棧(Operand Stack)也稱做操做棧,是一個後入先出棧(LIFO)。隨着方法執行和字節碼指令的執行,會從局部變量表或對象實例的字段中複製常量或變量寫入到操做數棧,再隨着計算的進行將棧中元素出棧到局部變量表或者返回給方法調用者,也就是出棧/入棧操做。
動態連接:Java虛擬機棧中,每一個棧幀都包含一個指向運行時常量池中該棧所屬方法的符號引用,持有這個引用的目的是爲了支持方法調用過程當中的動態連接(Dynamic Linking)。
方法返回:不管方法是否正常完成,都須要返回到方法被調用的位置,程序才能繼續進行。
本地方法棧(Native Method Stacks)
總結
排序算法的優劣
排序算法的分類
冒泡排序
圖示
示例代碼
package study1; import java.util.Scanner; public class a { public static void main(String[] args) { int[] array1 = new int[10]; System.out.println("請輸入須要排列的十個整數:"); Scanner getNumber = new Scanner(System.in); for(int i=0; i<10; i++){ array1[i] = getNumber.nextInt(); } //冒泡排序 for(int i=0; i<10; i++){ for(int j=0; j<array1.length-1-i; j++){ if(array1[j] > array1[j+1]){ int temp = array1[j]; array1[j] = array1[j+1]; array1[j+1] = temp; } } } System.out.println("排序完成!"); for(int i=0; i<10; i++){ System.out.println(array1[i]); } } }
理解:
選擇排序
圖示
示例代碼
package study1; public class a { public static void main(String[] args) { int[] array = {11, 21, 4, 65, 32, 7}; for(int i=0; i<array.length; i++){ int minIndex = i; for(int j=i; j<array.length; j++){ if(array[j] < array[minIndex]){ minIndex = j; } } int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } for(int k=0; k<array.length; k++){ System.out.println(array[k]); } } }
理解:
插入排序
圖示
代碼示例
package study1; public class a { public static void main(String[] args) { int[] array = {11, 21, 4, 65, 32, 7}; int current; for (int i = 0; i < array.length - 1; i++) { current = array[i + 1]; // 當前排序到的元素 int preIndex = i; // 已經排序完成的最後一個元素的下標 // 將當前排序的元素與每一個已完成排序的元素比較 while (preIndex >= 0 && current < array[preIndex]) { array[preIndex + 1] = array[preIndex]; preIndex--; } array[preIndex + 1] = current; } for(int j=0; j<array.length; j++){ System.out.println(array[j]); } } }
理解:
靜態初始化:int[][] arr = new int[][]{{1, 2, 3}, {"a", "b", "c"}};
動態初始化:String[][] arr2 = new String[2][3];
(第二個數組能夠暫時不去指定元素個數)
注意:二維數組中的外層元素保存的是地址值(內層數組,數組爲引用數據類型),也就是說,若不給二維數組初始化將保存的值爲null(引用數據類型的默認值)
楊輝三角
package study1; public class a { public static void main(String[] args) { int[][] array = new int[10][]; for(int i=0; i<array.length; i++){ array[i] = new int[i + 1]; array[i][0] = array[i][i] = 1; if(i>1){ for(int j=1; j<array[i].length -1; j++){ array[i][j] = array[i-1][j-1] + array[i-1][j]; } } } for(int i=0; i<array.length; i++){ for(int j=0; j<array[i].length; j++){ System.out.print(array[i][j] + "\t"); } System.out.println(); } } }
java.util.Arrays
:操做數組的工具類Arrays.equals(a, b)
比較兩個數組是否相同Arrays.toString(a)
以字符串的形式輸出數組Arrays.fill(a, value)
將數組中全部的元素替換爲指定的值Arrays.sort(b)
將數組排序(快速排序)Arrays.binarySearch(b, 1)
使用二分法查找有序數組(返回值爲複數則未找到指定元素)new Phone().function···
示例
public class Dog{ String breed; int age; String color; void barking(){ } void hungry(){ } void sleeping(){ } }
一個類能夠包含如下類型變量:
每一個類都有構造方法。若是沒有顯式地爲類定義構造方法,Java 編譯器將會爲該類提供一個默認構造方法。
在建立一個對象的時候,至少要調用一個構造方法。構造方法的名稱必須與類同名,一個類能夠有多個構造方法。
示例
public class Puppy{ public Puppy(){ // 沒有返回值 } public Puppy(String name){ // 這個構造器僅有一個參數:name } }
對象是根據類建立的。在Java中,使用關鍵字 new 來建立一個新的對象。建立對象須要如下三步:
示例
public class Puppy{ public Puppy(String name){ //這個構造器僅有一個參數:name System.out.println("小狗的名字是 : " + name ); } public static void main(String[] args){ // 下面的語句將建立一個Puppy對象 Puppy myPuppy = new Puppy( "tommy" ); } }
import java.util.*;
由static修飾的變量稱爲靜態變量,其實質上就是一個全局變量。若是某個內容是被全部對象所共享,那麼該內容就應該用靜態修飾;沒有被靜態修飾的內容,實際上是屬於對象的特殊描述。
不一樣的對象的實例變量將被分配不一樣的內存空間, 若是類中的成員變量有類變量,那麼全部對象的這個類變量都分配給相同的一處內存,改變其中一個對象的這個類變量會影響其餘對象的這個類變量,也就是說對象共享類變量。
成員變量和類變量的區別:
成員變量隨着對象的建立而存在,隨着對象的回收而釋放。
靜態變量隨着類的加載而存在,隨着類的消失而消失。
成員變量只能被對象調用。
靜態變量能夠被對象調用,還能夠被類名調用。
成員變量也稱爲實例變量。
靜態變量也稱爲類變量。
成員變量存儲在堆內存的對象中,因此也叫對象的特有數據。
靜態變量數據存儲在方法區(共享數據區)的靜態區,因此也叫對象的共享數據
static關鍵字
static 關鍵字,是一個修飾符,用於修飾成員(成員變量和成員函數)。
一、想要實現對象中的共性數據的對象共享。能夠將這個數據進行靜態修飾。
二、被靜態修飾的成員,能夠直接被類名所調用。也就是說,靜態的成員多了一種調用方式。類名.靜態方式。
三、靜態隨着類的加載而加載。並且優先於對象存在。
注意
一、有些數據是對象特有的數據,是不能夠被靜態修飾的。由於那樣的話,特有數據會變成對象的共享數據。這樣對事物的描述就出了問題。因此,在定義靜態時,必需要明確,這個數據是不是被對象所共享的。
二、靜態方法只能訪問靜態成員,不能夠訪問非靜態成員。由於靜態方法加載時,優先於對象存在,因此沒有辦法訪問對象中的成員。
三、靜態方法中不能使用this,super關鍵字。由於this表明對象,而靜態在時,有可能沒有對象,因此this沒法使用
是否真的須要靜態成員
一、成員變量。(數據共享時靜態化)
該成員變量的數據是不是全部對象都同樣:
若是是,那麼該變量須要被靜態修飾,由於是共享的數據。
若是不是,那麼就說這是對象的特有數據,要存儲到對象中。
二、成員函數。(方法中沒有調用特有數據時就定義成靜態)
若是判斷成員函數是否須要被靜態修飾呢?
只要參考,該函數內是否訪問了對象中的特有數據:
若是有訪問特有數據,那方法不能被靜態修飾。
若是沒有訪問過特有數據,那麼這個方法須要被靜態修飾。
成員變量和靜態變量的區別:
一、成員變量所屬於對象。因此也稱爲實例變量。
靜態變量所屬於類。因此也稱爲類變量。
二、成員變量存在於堆內存中。
靜態變量存在於方法區中。
三、成員變量隨着對象建立而存在。隨着對象被回收而消失。
靜態變量隨着類的加載而存在。隨着類的消失而消失。
四、成員變量只能被對象所調用 。
靜態變量能夠被對象調用,也能夠被類名調用。
因此,成員變量能夠稱爲對象的特有數據,靜態變量稱爲對象的共享數據。
一、構造方法的名字和類名相同,而且沒有返回值。
二、構造方法主要用於爲類的對象定義初始化狀態。
三、咱們不能直接調用構造方法,必須經過new關鍵字來自動調用,從而建立類的實例。
四、Java的類都要求有構造方法,若是沒有定義構造方法,Java編譯器會爲咱們提供一個缺省的構造方法,也就是不帶參數的構造方法。
new關鍵字的做用
一、爲對象分配內存空間。
二、引發對象構造方法的調用。
三、爲對象返回一個引用。
命名規則
語法示例
修飾符 返回值類型 方法名(參數類型 參數名){ ... 方法體 ... return 返回值; }
修飾符:修飾符,這是可選的,告訴編譯器如何調用該方法。定義了該方法的訪問類型。
返回值類型 :方法可能會返回值。returnValueType 是方法返回值的數據類型。有些方法執行所需的操做,但沒有返回值。在這種狀況下,returnValueType 是關鍵字void。
方法名:是方法的實際名稱。方法名和參數表共同構成方法簽名。
參數類型:參數像是一個佔位符。當方法被調用時,傳遞值給參數。這個值被稱爲實參或變量。參數列表是指方法的參數類型、順序和參數的個數。參數是可選的,方法能夠不包含任何參數。
方法體:方法體包含具體的語句,定義該方法的功能。
可變參數
可變參數的聲明: typeName... parameterName
注意!區分值傳遞和引用傳遞
示例
package study1; public class a { public static void main(String[] args) { fun(1, 22, 31, 2, 44, 21, 98); fun(new int[]{1, 22, 31, 2, 44, 21, 98}); } public static void fun(int... numbers){ if (numbers.length == 0) { System.out.println("No argument passed"); return; } int result = numbers[0]; for (int i = 1; i < numbers.length; i++){ if (numbers[i] > result) { result = numbers[i]; } } System.out.println("The max value is " + result); } }
finalize
方法
Java 容許定義這樣的方法,它在對象被垃圾收集器析構(回收)以前調用,這個方法叫作 finalize( ),它用來清除回收對象。
在 finalize() 方法裏,你必須指定在對象銷燬時候要執行的操做。
固然,Java 的內存回收能夠由 JVM 來自動完成。若是你手動使用,則可使用上面的方法。
該函數的通常格式
protected void finalize() // 關鍵字 protected 是一個限定符,它確保 finalize() 方法不會被該類之外的代碼調用。 { // 在這裏終結代碼 }
int larger = max(30, 40);
System.out.println("Hello Java");
Tip:注意!在一些其它語言中方法指過程和函數。一個返回非void類型返回值的方法稱爲函數;一個返回void類型返回值的方法叫作過程。
一個方法在內部調用自身稱爲遞歸調用
方法的遞歸包含了一種隱式的循環,他會重複指定某段代碼,可是這種循環執行無需循環的控制
遞歸必定要已知方向遞歸(臨界條件),不然將會稱爲無窮遞歸(相似與死循環)
簡單示例
// 遞歸求和 public static int fun(int x){ if(x == 1){ return 1; }else{ return x + fun(x - 1); } }
變量的範圍是程序中該變量能夠被引用的部分。
方法內定義的變量被稱爲局部變量。
局部變量的做用範圍從聲明開始,直到包含它的塊結束。
局部變量必須聲明纔可使用。
方法的參數範圍涵蓋整個方法。參數其實是一個局部變量。
for循環的初始化部分聲明的變量,其做用範圍在整個循環。
但循環體內聲明的變量其適用範圍是從它聲明到循環體結束。它包含以下所示的變量聲明:
你能夠在一個方法裏,不一樣的非嵌套塊中屢次聲明一個具備相同的名稱局部變量,但你不能在嵌套塊內兩次聲明局部變量。
Tip:命令行參數是在執行程序時候緊跟在程序名字後面的信息。
this()
,根據傳入參數類型的不一樣而實現不一樣構造器的調用,且必須放置在構造器的首行
Tip:程序設計的理念:高內聚,低耦合。
修飾符 | 當前類 | 同一包內 | 子孫類(同一包) | 子孫類(不一樣包) | 其餘包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N | N |
default |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
Tip:構造器的訪問權限必定是小於該類的訪問權限(若構造器的訪問權限大於該類的訪問權限則是無效的)
package pkg1[.pkg2[.pkg3…]];
(每 .
一次就表明一層文件目錄 )
import package1[.package2…].(classname|*);
*
可是,導入的內容不包括該包下的子包xyz.patrickstar.com.Person
import static XXX
:導入指定類或者接口中的靜態結構Tip:類目錄的絕對路徑叫作 class path。設置在系統變量 CLASSPATH 中。編譯器和 java 虛擬機經過將 package 名字加到 class path 後來構造 .class 文件的路徑。一個 class path 可能會包含好幾個路徑,多路徑應該用分隔符分開。默認狀況下,編譯器和 JVM 查找當前目錄。JAR 文件按包含 Java 平臺相關的類,因此他們的目錄默認放在了 class path 中。
用下面的命令顯示當前的CLASSPATH變量:
刪除當前CLASSPATH變量內容:
設置CLASSPATH變量:
建立一個做爲模型的 Student 對象。StudentView 是一個把學生詳細信息輸出到控制檯的視圖類,StudentController 是負責存儲數據到 Student 對象中的控制器類,並相應地更新視圖 StudentView。
MVCPatternDemo,演示類使用 StudentController 來演示 MVC 模式的用法。
格式:
class 父類 { } class 子類 extends 父類 { }
須要注意的是 Java 不支持多繼承,但支持多重繼承。
final class 類名 {//類體}
修飾符(public/private/default/protected) final 返回值類型 方法名(){//方法體}
Tip:注意!實例變量也能夠被定義爲 final,被定義爲 final 的變量不能被修改。被聲明爲 final 類的方法自動地聲明爲 final,可是實例變量並非 final
子類是不繼承父類的構造器(構造方法或者構造函數)的,它只是調用(隱式或顯式)。若是父類的構造器帶有參數,則必須在子類的構造器中顯式地經過 super 關鍵字調用父類的構造器並配以適當的參數列表。
若是父類構造器沒有參數,則在子類的構造器中不須要使用 super 關鍵字調用父類構造器,系統會自動調用父類的無參構造器。