學習mybatis之前先複習下相關的javaj知識
例如:private static final String CONFIG="mybatis-config.xml";
1 private
訪問權限 類 包 子類 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×
2 static final###01final關鍵字概念
* A: 概述
繼承的出現提高了代碼的複用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,
或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,
就可以對其中的方法進行重寫,那怎麼解決呢?
要解決上述的這些問題,需要使用到一個關鍵字final,final的意思爲最終,不可變。
final是個修飾符,它可以用來修飾類,類的成員,以及局部變量。
###02final修飾類義
* A: final 修飾類
final修飾類不可以被繼承,但是可以繼承其他類。
* B: 案例
class Yy {}
final class Fu extends Yy{} //可以繼承Yy類
class Zi extends Fu{} //不能繼承Fu類
###03final修飾方法
* A: final修飾方法
final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋後可以加final。
* B: 案例
class Fu {
// final修飾的方法,不可以被覆蓋,但可以繼承使用
public final void method1(){}
public void method2(){}
}
class Zi extends Fu {
//重寫method2方法
public final void method2(){}
}
###04final修飾局部變量
* A:修飾基本數據類型變量
final修飾的變量稱爲常量,這些變量只能賦值一次
* B:案例1
final int i = 20;
i = 30; //賦值報錯,final修飾的變量只能賦值一次
* C: 修飾引用數據類型
引用類型的變量值爲對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改
* D: 修飾引用數據類型
final Person p = new Person();
Person p2 = new Person();
p = p2; //final修飾的變量p,所記錄的地址值不能改變
p.name = "小明";//可以更改p對象中name屬性值
p不能爲別的對象,而p對象中的name或age屬性值可更改。
###05final修飾成員變量
* A: 修飾成員變量
修飾成員變量,需要在創建對象前賦值,否則報錯。(當沒有顯式賦值時,多個構造方法的均需要爲其賦值。)
* B: 案例
class Demo {
//直接賦值
final int m = 100;
//final修飾的成員變量,需要在創建對象前賦值,否則報錯。
final int n;
public Demo(){
//可以在創建對象時所調用的構造方法中,爲變量n賦值
n = 2016;
}
}
###06static的概念
* A:概念
當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。
當在調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多餘。
可是不創建對象,方法又調用不了,這時就會想,那麼我們能不能不創建對象,就可以調用方法呢?
可以的,我們可以通過static關鍵字來實現。static它是靜態修飾符,一般用來修飾類中的成員。
==============================第二節課開始====================================
###07static修飾的對象特有數據
* A:特點1:
被static修飾的成員變量屬於類,不屬於這個類的某個對象。
(也就是說,多個對象在訪問或修改static修飾的成員變量時,其中一個對象將static成員變量值進行了修改,
其他對象中的static成員變量值跟着改變,即多個對象共享同一個static成員變量)
* B: 代碼演示
class Demo {
public static int num = 100;
}
class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num); //結果爲200
System.out.println(d2.num); //結果爲200
}
}
###08static的內存圖
* A: 略
參考day13_source 靜態的內存圖.jpg
###09static注意事項_靜態不能直接調用非靜態
* A: 注意事項
被static修飾的成員可以並且建議通過類名直接訪問。
* B: 訪問靜態成員的格式:
類名.靜態成員變量名
類名.靜態成員方法名(參數)
對象名.靜態成員變量名 ------不建議使用該方式,會出現警告
對象名.靜態成員方法名(參數) ------不建議使用該方式,會出現警告
* C: 代碼演示
class Demo {
//靜態成員變量
public static int num = 100;
//靜態方法
public static void method(){
System.out.println("靜態方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
###10static靜態的使用場景
* A: 使用場景
static可以修飾成員變量和成員方法。
什麼時候使用static修飾成員變量?
加static修飾成員的時候,這個成員會被類的所有對象所共享。一般我們把共性數據定義爲靜態的變量
什麼時候使用static修飾成員方法?
靜態的方法只能訪問靜態的成員,如果靜態方法中引用到了靜態的其他成員,那麼這個方法需要聲明爲靜態的方法。
###11對象中的靜態調用
* A: 對象的靜態調用
在多態中,非靜態編譯看父類,運行看子類,父類沒有編譯失敗。
但多態中的靜態方法,編譯看父類,運行仍然看父類。因爲靜態和對象沒有關係,屬於靜態綁定。
* B: 舉例
public class Test{
public static void main(String[] args){
Fu f = new Zi();
f.show(); //父類的引用和父類的方法綁定,和對象無關,不會在運行時動態的執行子類特有的方法。
}
}
###12定義靜態常量
* A: 靜態常量
開發中,我們想在類中定義一個靜態常量,通常使用public static final修飾的變量來完成定義。
此時變量名用全部大寫,多個單詞使用下劃線連接。
* B: 定義格式:
public static final 數據類型 變量名 = 值;
* C: 如下演示:
class Company {
public static final String COMPANY_NAME = "傳智播客";
public static void method(){
System.out.println("一個靜態方法");
}
}
當我們想使用類的靜態成員時,不需要創建對象,直接使用類名來訪問即可。
System.out.println(Company.COMPANY_NAME); //打印傳智播客
Company.method(); // 調用一個靜態方法
* D: 注意:
接口中的每個成員變量都默認使用public static final修飾。
所有接口中的成員變量已是靜態常量,由於接口沒有構造方法,所以必須顯示賦值。可以直接用接口名訪問。
interface Inter {
public static final int COUNT = 100;
}
訪問接口中的靜態變量
Inter.COUNT
3
4
數據的存儲結構
A:數據的存儲結構
a:棧結構:後進先出/先進後出(手槍彈夾) FILO (first in last out)
b:隊列結構:先進先出/後進後出(銀行排隊) FIFO(first in first out)
c:數組結構:
查詢快:通過索引快速找到元素
增刪慢:每次增刪都需要開闢新的數組,將老數組中的元素拷貝到新數組中
開闢新數組耗費資源
d:鏈表結構
查詢慢:每次都需要從鏈頭或者鏈尾找起
增刪快:只需要修改元素記錄的下個元素的地址值即可不需要移動大量元素
5
01List接口的特點
A:List接口的特點:
a:它是一個元素存取有序的集合。
例如,存元素的順序是11、22、33。那麼集合中,元素的存儲就是按照11、22、33的順序完成的)。
b:它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。
c:集合中可以有重複的元素,通過元素的equals方法,來比較是否爲重複的元素。
d:List接口的常用子類有:
ArrayList集合
LinkedList集合
###02List接口的特有方法
A:List接口的特有方法(帶索引的方法)
a:增加元素方法
add(Object e):向集合末尾處,添加指定的元素
add(int index, Object e) 向集合指定索引處,添加指定的元素,原有元素依次後移
/*
* add(int index, E)
* 將元素插入到列表的指定索引上
* 帶有索引的操作,防止越界問題
* java.lang.IndexOutOfBoundsException
* ArrayIndexOutOfBoundsException
* StringIndexOutOfBoundsException
*/
public static void function(){
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
System.out.println(list);
list.add(1, "itcast");
System.out.println(list);
}
b:刪除元素刪除
remove(Object e):將指定元素對象,從集合中刪除,返回值爲被刪除的元素
remove(int index):將指定索引處的元素,從集合中刪除,返回值爲被刪除的元素
/*
* E remove(int index)
* 移除指定索引上的元素
* 返回被刪除之前的元素
*/
public static void function_1(){
List<Double> list = new ArrayList<Double>();
list.add(1.1);
list.add(1.2);
list.add(1.3);
list.add(1.4);
Double d = list.remove(0);
System.out.println(d);
System.out.println(list);
}
c:替換元素方法
set(int index, Object e):將指定索引處的元素,替換成指定的元素,返回值爲替換前的元素
/*
* E set(int index, E)
* 修改指定索引上的元素
* 返回被修改之前的元素
*/
public static void function_2(){
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Integer i = list.set(0, 5);
System.out.println(i);
System.out.println(list);
}
d:查詢元素方法
get(int index):獲取指定索引處的元素,並返回該元素
6
01List接口的特點
A:List接口的特點:
a:它是一個元素存取有序的集合。
例如,存元素的順序是11、22、33。那麼集合中,元素的存儲就是按照11、22、33的順序完成的)。
b:它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。
c:集合中可以有重複的元素,通過元素的equals方法,來比較是否爲重複的元素。
d:List接口的常用子類有:
ArrayList集合
LinkedList集合
###02List接口的特有方法
A:List接口的特有方法(帶索引的方法)
a:增加元素方法
add(Object e):向集合末尾處,添加指定的元素
add(int index, Object e) 向集合指定索引處,添加指定的元素,原有元素依次後移
/*
* add(int index, E)
* 將元素插入到列表的指定索引上
* 帶有索引的操作,防止越界問題
* java.lang.IndexOutOfBoundsException
* ArrayIndexOutOfBoundsException
* StringIndexOutOfBoundsException
*/
public static void function(){
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
System.out.println(list);
list.add(1, "itcast");
System.out.println(list);
}
b:刪除元素刪除
remove(Object e):將指定元素對象,從集合中刪除,返回值爲被刪除的元素
remove(int index):將指定索引處的元素,從集合中刪除,返回值爲被刪除的元素
/*
* E remove(int index)
* 移除指定索引上的元素
* 返回被刪除之前的元素
*/
public static void function_1(){
List<Double> list = new ArrayList<Double>();
list.add(1.1);
list.add(1.2);
list.add(1.3);
list.add(1.4);
Double d = list.remove(0);
System.out.println(d);
System.out.println(list);
}
c:替換元素方法
set(int index, Object e):將指定索引處的元素,替換成指定的元素,返回值爲替換前的元素
/*
* E set(int index, E)
* 修改指定索引上的元素
* 返回被修改之前的元素
*/
public static void function_2(){
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Integer i = list.set(0, 5);
System.out.println(i);
System.out.println(list);
}
d:查詢元素方法
get(int index):獲取指定索引處的元素,並返回該元素
6
數據的存儲結構
A:數據的存儲結構
a:棧結構:後進先出/先進後出(手槍彈夾) FILO (first in last out)
b:隊列結構:先進先出/後進後出(銀行排隊) FIFO(first in first out)
c:數組結構:
查詢快:通過索引快速找到元素
增刪慢:每次增刪都需要開闢新的數組,將老數組中的元素拷貝到新數組中
開闢新數組耗費資源
d:鏈表結構
查詢慢:每次都需要從鏈頭或者鏈尾找起
增刪快:只需要修改元素記錄的下個元素的地址值即可不需要移動大量元素
7---------------------------
###06LinkedList集合的自身特點
A:LinkedList集合的自身特點
底層採用鏈表結構,每次查詢都要從鏈頭或鏈尾找起,查詢相對數組較慢
但是刪除直接修改元素記錄的地址值即可,不要大量移動元素
LinkedList的索引決定是從鏈頭開始找還是從鏈尾開始找
如果該元素小於元素長度一半,從鏈頭開始找起,如果大於元素長度的一半,則從鏈尾找起
###07LinkedList特有方法
*A:LinkedList特有方法:獲取,添加,刪除
/*
* LinkedList 鏈表集合的特有功能
* 自身特點: 鏈表底層實現,查詢慢,增刪快
*
* 子類的特有功能,不能多態調用
*/
public class LinkedListDemo {
public static void main(String[] args) {
function_3();
}
/*
* E removeFirst() 移除並返回鏈表的開頭
* E removeLast() 移除並返回鏈表的結尾
*/
public static void function_3(){
LinkedList<String> link = new LinkedList<String>();
link.add("1");
link.add("2");
link.add("3");
link.add("4");
String first = link.removeFirst();
String last = link.removeLast();
System.out.println(first);
System.out.println(last);
System.out.println(link);
}
/*
* E getFirst() 獲取鏈表的開頭
* E getLast() 獲取鏈表的結尾
*/
public static void function_2(){
LinkedList<String> link = new LinkedList<String>();
link.add("1");
link.add("2");
link.add("3");
link.add("4");
if(!link.isEmpty()){
String first = link.getFirst();
String last = link.getLast();
System.out.println(first);
System.out.println(last);
}
}
public static void function_1(){
LinkedList<String> link = new LinkedList<String>();
link.addLast("a");
link.addLast("b");
link.addLast("c");
link.addLast("d");
link.addFirst("1");
link.addFirst("2");
link.addFirst("3");
System.out.println(link);
}
/*
* addFirst(E) 添加到鏈表的開頭
* addLast(E) 添加到鏈表的結尾
*/
public static void function(){
LinkedList<String> link = new LinkedList<String>();
link.addLast("heima");
link.add("abc");
link.add("bcd");
link.addFirst("itcast");
System.out.println(link);
}
}