JAVA學習筆記(一),JAVA學習筆記(
JDK :給Java開發人員使用的工具包,包括Java的開發工具,也包括JRE。其中開發工具中包括編譯工具(javac.exe)、運行工具(java.exe)、打包工具(jar.exe)等。
JRE :Java的運行環境,包括Java虛擬機器和Java程式運行所需的核心類庫。
JVM :Java虛擬機器。
兩者之間的關係:
JDK=JRE+開發工具
JRE=JVM+核心類庫
JAVA配置jdk環境變數
JAVA_HOME C:\Program Files\Java\jdk1.7.0_21
Path %JAVA_HOME%\bin;
使用jar包時要這樣使用“ java –cp test.jar Test”
記住Java程式中很容易犯的第一個錯誤:java.lang.NoClassDefFoundError
– 初學者經常會遇到這個錯誤,而遇到這個錯誤,99.9%的情況,是因為你在CLASSPATH中忘
掉了需要的jar包
– 所以,遇到這個錯誤,回頭去找齊你所有的jar包,然後再到java社區去問問題
關鍵字中所有字母都為小寫;
Java的命名規範:
包名:多單片語成時所有字母都小寫,網域名稱倒著寫(com.***.www)
類名介面名:多單片語成時,所有單字首大寫
變數名和函數名:多單片語成時,第一個單詞首字母小寫,第二個單詞開始每個單字首大寫
常量名:所有字母都大寫,多單詞時每個單詞用底線串連
Java資料類型:
byte 1個位元組 (8位) -2^7------2^7-1 =-128 到127
short 短整型 2個位元組 (16位) -2^15------2^15-1 3W多
int 整型 4個位元組(32位) -2^31------2^31-1 上億
long 長整型 8個位元組(64位) -2^63------2^63-1 (後面加L)
float 4個位元組 (32位) 單精確度(後面加f)
double 8個位元組(64位) 雙精確度
char 2個位元組
boolean 1個位元組 true false
強制類型轉換:(byte)(a+10)--將a+10強制轉換為byte
字元與數字計算會轉化為ASCII碼數字與數字計算
switch函數運算式中,java 1.6(包括)以前,只是支援等價成int 基本類型的資料:byte ,short,char,int(其他的都不可以)。1.7加入的新特性可以支援String類型的資料。
方法(函數):
注意:
1)方法不能定義在另一個方法裡
2)方法可以調用另一個方法
3)方法沒有傳回值就不用寫return 方法的聲明要寫void ,有就寫return
4)方法不調用不執行
方法命名規則:如果是一個單詞要全部小寫,如果是二個單詞,第二個單字首大寫
什麼是重載:在同一個類中,如果方法名相同,參數的類型及參數的個數不同即可,注意與傳回值無關。
記憶體分析:
棧(stack)記憶體:用於儲存局部變數,當資料使用完,所佔空間會自動釋放。方法運行時調入棧記憶體中,不再使用時,只刪除棧記憶體中的方法,方法區內的方法依然保留。
堆(heap)記憶體:數組和對象,通過new建立的執行個體都放在堆記憶體中;每一個實體都有記憶體位址值;實體中的變數都有預設初始化值;實體不再被使用,會在不確定的時間內被記憶體回收行程回收,儲存全域變數。
方法區(資料區):用於存放方法,分為靜態方法區和非靜態方法區。
注意:int [][] arr= new int[10][];一維必須有值才能正確建立二維數組。
數組的特點:
1)建立時就給定大小(可以給0但,用列印或賦值時會報運行時錯)
2)數組初始值: int型預設0 float型預設0.0f boolean 型預設false
char型預設’\u0000’ 相於當 ‘ ’(Null 字元)
3)數組有下標,且從0開始
4)得到數組大小的屬性:數組名.length
求最大值:
int maxElement = a[0];
for (int x = 1; x < a.length; x++) {
if (a[x] > maxElement) {
maxElement = a[x];
}
}
return maxElement;
選擇排序:
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int min = arr[j];
arr[j] = arr[i];
arr[i] = min;
}
}
冒泡排序:
for(int i=0;i<arr.length-1;i++){ //控制比較的次數 -1:因為是二二比較,比較的次數比數組長度要小1
for(int j=0;j<arr.length-1-i;j++){//-1:因為是二二比較;-i: 每比較一次,最後值一定是在最後面的,所以最大值就不用比較了。
if(arr[j]>arr[j+1]){//小的放前面,大的放後面
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
二分尋找法:
int min=0;
int max=arr.length-1;
int mid = (min+max)/2;
while(arr[mid] != key){
if(key>arr[mid]){
min=mid+1;
}
else if(key< arr[mid]){
max=mid-1;
}
if(max<min){
return -1;
}
mid=(max+min)/2;
}
return mid;
數組的排序:
Arrays.sort()方法:對數組進行從小到大排序,需要引入包 java.util.Arrays
數組的尋找:
java.util.Arrays.binarySearch(object [] arr ,object key)//一個是數組 一個是要查的數
有傳回值: 如果找到返回下標,沒找到返回-1
注意:此方法底層用的是二分尋找法(折半尋找法),所以用此方法之前先排序
數組的拷貝:
Java.lang.System.arraycopy(源數組名,源數組起始位置,目標數組,目標數組插入位置,要拷貝的長度)
沒傳回值
注意:如:源數組裡有6個,我們要拷貝出7個到目標數組,就會數組下標越界異常。
面向過程:
每一步都由我們自已親自去完成,缺點,效率低,不容易維護,複用性差
物件導向的特點:使複雜的事件變簡單
由執行者變成了指揮者
效率高,容易維護,複用性好。
注意:類名.方法名()
對象名.方法名()的區別?
類名.方法名() 方法名加了static
對象名.方法名() 方法名沒加static
一個類檔案可以有多個類,但是類檔案名稱所對應的類前面必須是public,一個類只有一個類名是public的
一個類中沒有main()方法是可以的,但是不能被JVM所調用。
註:
類名 變數名 = new 類名 ();
變數名 =null;
變數名.屬性=值。
變數名.方法(); 會報null 指標異常
局部變數和全域變數的區別?
1.全域變數定在類中,整個類都可以用
局部變數定義在方法中,代碼塊中,語句中,只有所屬的地區有效
2.全域變數存在堆(heap)中,局部變數存在於棧(stack)中
3.全域變數隨著對象的建立而存在,隨著對象的消失而消失。
局部變數隨著所屬地區執行而存在,執行結束而消失。
4.全域變數都是有預設初始值的,不給值能用
局部變數沒有預設初始值的,不給值不能用
局部變數與全域變數重名
重名先在所在地區中找變數,如果所在地區沒有去全域中找,如果都有就用所在地區中的變數
類類型(引用型)當參數:對象中的屬性相同我們可以把他們共同的屬性寫在一個方法裡
匿名對象:沒有名字的對象 new Ren();
匿名對象特點:如果這個對象裡的方法或屬性,只被調用一次,那麼就可以用匿名對象它主要的功能是為了簡化程式員書寫代碼。
基礎資料型別 (Elementary Data Type)當參數:方法的參數是一個數值
引用資料類型當參數:方法的參數是一個地址
Java許可權存取修飾詞
1.public:公用許可權 修飾類、屬性、方法。可以被任意類訪問。
2.protected:受保護的許可權 修飾屬性、方法。可以被同包類訪問,如果不是同包類,必須是該類的子類才可以訪問。
3.default:同包許可權 修飾類、屬性、方法。 只能被同包類訪問。
4.private:私人許可權 修飾屬性、方法。 只能在本類中訪問。
封裝:是指隱藏對象的屬性和實現細節,僅對外提供公用訪問方式。
好處:將變化隔離、便於使用、提高重用性、提高安全性。
封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公用方法對其訪問。
封裝主要使用private
用Myeclipse來寫set() get()
在類右鍵-----》source---> getters and setters
注意:private私人是封裝的一種體現,私人是封裝,但封裝不單單指的是私人。
構造方法是幹嘛用的?
是為了建立對象用的。
構造方法的分類?
預設構造方法和自訂構造方法
構造方法特點:
類名和方法名相同,存取權限修飾符和類的存取權限修飾符相同(可省略)。
構造方法沒有傳回值,且不用void 。
預設構造方法和自訂構造方法的區別?
1)預設構造方法是無參的。自訂構造方法是有參的。
2)自訂構造方法可以有多個,多個構造方法是以重載的形式存在的,
預設構造方法只有一個。
3)預設構造方法在類中預設(不寫)存在。
4)類中如果有自訂構造方法,但不寫出預設構造方法,那預設構造方法就消失。
什麼時候用自訂構造方法?
在建立對象時,想讓對象一建立出來就帶有一些指定的值,用自訂構造方法。
如果帶預設值用預設構造方法。
構造方法和普通方法的區別?
1.構造方法:對象建立時,就會自動構造方法,對類進行初始化。
普通方法:對象建立後,才能調用普通方法
2.對象建立時,構造方法只會調用一次
普通方法:對象建立後,可以被調用多次
注意:構造方法和賦值方法不衝突
this:代表當前對象
this如何用?
1.當參數名和全域變數相同時,在賦值時用this!!!!!!(必須),
2.對象調用屬性時用this(不是必須,可省略)
3.對象調用方法時用this(不是必須,可省略)
4.預設構造方法調用自訂構造方法: Book3(,,)
1)預設構造方法中this(,,),必須放在當前構造方法的第一行
2)自訂構造方法調用預設構造方法 Book3()
自訂構造方法this(),必須放在當前構造方法的第一行
注意:用this在調用構造方法時,不要出現死迴圈。
static : 靜態。可以修飾屬性,方法,代碼塊。
屬性:
1)通過類名.屬性名稱
2)被所有對象共用
方法:通過類名.方法名 -----》對象名.方法名()
代碼塊:在類載入時就執行,且執行一次
靜態代碼塊 > 構造代碼塊 > 構造方法
static代碼塊
隨著類的載入而載入,只執行一次
用於給類進行初始化
構造代碼塊(構造方法給對象初始化)
{ }
static代碼塊和構造代碼塊同時出現時優先順序
靜態代碼塊>構造代碼塊>構造方法
static使用時間:
static修飾屬性:這個屬性如果被所有對象共用。
static修飾方法:該方法是訪問對象中的靜態變數的。
static方法只能訪問static變數;非static方法能訪問static和非static變數。
static方法不能使用this關鍵字,局部變數不能用static來修飾。
非靜態變數和靜態變數的區別?
二個變數的生存周期不同
非靜態變數隨著對象的建立而存在,隨著對象的回收而釋放
靜態變數隨著類的載入而存在,隨著類的消失而消失
調用方式不同
非靜態變數只能被對象調用
靜態變數可以被對象,還可以被類調用
別名不同
非靜態變數稱為執行個體變數
靜態變數稱為類變數
資料存放區位置不同
非靜態變數儲存在堆記憶體的對象中,也稱為對象的特有資料
靜態變數資料存放區在方法區(資料區)的靜態區中