生活随笔
收集整理的這篇文章主要介紹了
java疯狂讲义 摘录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一。
編譯型語言:編譯+鏈接,一次性編譯成機器碼,可以脫離開發環境獨立運行,運行效率較高,但是不易移植;解釋型語言:相當于編譯型中的編譯+解釋過程混合,但是每次執行都需要編譯一次,所以效率較低;移植性相對強,只需要提供對應平臺的解釋器就行了。jvm:可運行java字節碼的虛擬計算機。jre:java runtime environment,包括jvm+環境支持;jdk=jre+其他開發工具包安裝后文件bin:存放jdk各種工具命令,如java,javac;db:安裝javac db的路徑;include:特定頭文件;jre:jre環境;lib:jdk工具命令的實際執行程序;src.zip:java所有核心類庫的源碼;操作系統查找命令方式:根據path環境變量查找;Windows不區分大小寫,linux區分;對于java來說,把java和javac命令路徑添加到path變量中即可編譯運行java。系統變量優先于用戶變量,系統變量對所有用戶生效,用戶變量對當前用戶生效。classpath:添加lib/dt.jar,lib/tools.jar類的路徑,jdk1.5以后的不需要手動添加。一個java源文件最多只能定義一個public類。java虛擬機只會從main方法開始執行。垃圾回收機制:發現無用對象;回收被無用對象占用的內存空間不要從IDE工具開始學習----------我直接是從eclipse開始的,現在在用idea,但是并不了解IDE按鈕的作用,所以有可能真得從頭做起
二。面向對象基礎
成員變量+方法=類定義對象間的合作需要“消息”機制協助進行,消息機制是對象通信的機制。java不支持多繼承封裝指將對象實現細節隱藏起來,通過公用方法暴露對象功能,如各接口。多態是在繼承的基礎上的,判斷一個語言是否面向對象,通常可以使用繼承和多態進行判斷。
三。數據類型和運算符
java語言是強類型語言,包含如下含義:所有變量必須先聲明后使用;指定類型的變量只能接受與之匹配類型的值。強類型語言在編譯時就可以發現錯誤。注釋:文檔注釋/** ?*/ ,命令:javadoc 選項 源文件|包;常用javadoc標記:@author,@version,@deprecated 不推薦使用的方法,@param,@return,@see 參見,@exception,@throwsjava語言中的空格包括space,tab,enter等常用分隔符:(),{},[],圓點,空格,分號每個變量都代表一塊內存,而且變量是有名字的,程序對變量賦值,實際上就是把數據裝入變量對應內存區域的過程。變量分為基本類型(primitive type)和引用類型(referrence type)。基本類型包括boolean類型和數值類型,數值類型包括整數類型和浮點類型。整數類型包括byte(1B),short(2B),int(4B),long(8B),char(2B,代表字符型,也相當于無符號整數類型).浮點類型包括float(4B),double(8B)。引用類型包括類,接口和數組,還有特殊的null類型。所謂引用數據類型就是對一個對象的引用,對象包括實例和數組。實際上,引用類型變量就是一個指針。用16位的unicode字符集編碼方式表示字符型。char字符用單引號括起來,String類用雙引號括起來。自動類型轉換,強制類型轉換格式:(targettype)value。java中8種基本類型包裝類都有對應方法將字符串轉換為基本類型,parsexxx(String str)表達式類型自動提升,提升規則:所有byte,short,char類型提升到int類型;整個算術表達式的數據類型自動提升到與表達式中最高等級操作數同樣的類型。直接量,定義變量的時候直接賦給變量的值。字符串直接量,當程序第一次使用某個字符串直接量時,會使用常量池(constant pool)緩存。運算符:算術運算符,賦值,移位,邏輯運算符,比較運算符,類型相關運算符==比較數值類型,即使數據類型不同,只要值相等,也返回true,如5.0==5就返回true;而如果是兩個引用類型,比較的是內存地址,并且兩者必須具有父子繼承關系才能進行比較。三木運算符:(?:)可以嵌套位運算符與邏輯運算符有相似的地方,如與,或,異或等大部分運算符是從左到右結合的,只有單目運算符,賦值運算符,三木運算符
四。流程控制與數組
使用if else語句時,一定要優先處理范圍小的情況switch語句,參數類型只能是int,byte,char,short,枚舉,String類型(不能是stringbuffer,stringbuild)。每個case后需要加break語句。continue結束本次循環剩余語句,break結束本次循環;return直接結束整個方法體java 的數組可以存儲基本數據類型,也可以存儲引用數據類型。數組定義:type[] name,type name[],定義數組時不能指定內存空間,必須通過初始化定義內存空間(也就是為數組元素分配空間),數組長度不可變靜態初始化,動態初始化不要同時使用靜態初始化和動態初始化。foreach(type 變量名:array|collection){}自動遍歷數組元素
五。面向對象
static,修飾的成員表明屬于類本身,不屬于類的單個實例。Person p=new Person(),p是引用變量,指向實例this關鍵字,總是指向調用該方法的對象。this關鍵字最大的作用,就是讓類中一個方法,訪問該類里另一個方法或者實例變量。漢語中主謂賓的語法適用于程序,所以有時候看省略了this,實際上代碼底層已做處理。如果是static修飾,則默認使用該類作為主語;而非static修飾,則默認使用this作為主語。static修飾的方法和變量不能直接訪問非static修飾的方法和變量。簡單來說,static修飾的不需要實例化,非static修飾的需要實例化,然后用實例調用。this關鍵字在構造器中代表該構造器正在初始化的對象。java里方法的參數傳遞只有一種:值傳遞,就是將實際參數值的副本傳入方法內,參數本身不會受到影響。當系統開始執行方法時,系統為形參初始化,實際上就是把實參變量的值賦給形參變量,方法中操作的并不是實參變量。同樣的,引用類型也使用的是值傳遞,只是傳遞的是指針,相當于把變量的地址賦給了形參,所以會造成賦給的是實參的錯覺。因為賦給的是內存地址,所以實際上操作的是同一塊內存地址所指向的值。形參可變test(String... books),當做一個數組傳入;test(String[] books)這種調用方式要求實參傳入參數必須是數組定義方式遞歸方法:方法體內調用自身方法重載:同一個類中方法名相同,參數列表不同,與返回值類型,修飾符等沒關系。局部變量和成員變量成員變量無需顯式初始化,默認初始化的賦值規則與數組動態初始化的元素賦值規則相同。方法局部變量和代碼塊局部變量需要顯式初始化,而且生命周期只作用于定義的代碼塊或者方法體內。局部變量和成員變量同名時,局部變量會覆蓋成員變量。eyenum變量屬于static定義的類變量,因此和實例變量并不屬于一塊內存區域。封裝:將類的實現細節隱藏起來,只暴露方法。使用訪問控制符實現。JavaBean類是一個封裝良好的類,對應set胎兒和getter方法可以設置和獲取private 變量中變量的值。包名建議用公司域名倒寫。Java默認為所有源文件導入java.lang包下所有類。如果需要導入其他類,用import關鍵字。方法重寫(override),也叫方法重載,發生在子類和父類直接。兩同兩小一大原則:相同名字,相同形參個數;子類返回值類型比父類更小或者相等,子類拋出異常比父類更小或者相等;子類方法的訪問權限比父類更大或者相等。如果父類訪問權限是private,那么如果子類符合上述定義規則,也只是相當于子類定義了一個方法,并不是重寫父類方法。子類和父類要么都是類方法,要么都是實例方法,不可以不統一。子類需要調用父類的方法,用super關鍵字。父類和子類也可能發生重載,因為子類會繼承父類的方法,如果此時定義了一個方法名相同,形參列表不同,就發生了重載。新建一個子類實例時,會為這個對象分配兩塊內存,分別存儲子類和父類中的實例變量和方法。調用構造方法,都是先調用父類的構造方法,才調用子類構造方法, 只是我們感覺不到。Java引用變量有兩個類型:編譯時類型,聲明該變量時的類型決定;運行時類型,實際賦給該變量的對象決定。如果編譯時和運行時類型不一致,就可能出現多態。通過Object p=new Person()定義的變量p,只能調用Object類的方法,而不能調用Person類定義的方法。通過引用變量訪問實例變量,系統總是試圖訪問她編譯時類型定義的成員變量,而不是運行時的變量。強制類型轉換:(type)variable,換算前用instanceof運算符判斷一下是否可以轉換。a instanceof ClassType;子類--》父類,向上轉型;父類--》子類,強制轉換。引用變量 instanceof 類、接口,判斷對象是否屬于后面的類,是則返回true。如果操作數與后面的類不具有繼承關系,編譯會報錯。初始化塊:當Java創建一個對象時,系統先為該對象的所有實例變量分配內存,然后開始執行初始化。初始化順序是:先執行初始化塊或聲明實例變量時指定的初始值,再執行構造器里指定的初始值。自動裝箱(autoboxing),自動拆箱(autounboxing),基本類型變量和對應包裝類變量的轉換機制。toString()方法是一個“自我描述”方法,返回該對象實現類的類名+@+hashcode值,因此總是需要重寫Object類的toString方法。==判斷變量是否相等,如果是基本類型變量,只要數值相等就返回true;引用型變量,只有指向同一個對象才返回true,而且==不可以用來比較沒有父子關系的兩個對象。equals()方法是Object類提供的一個實例方法,因此所有變量都可調用該方法來判斷是否與其他引用變量相等,但是使用標準與==沒有區別,同樣要求指向同一個對象才返回true。單例(singleton)類,只能創建一個類實例final修飾符:可以用來修飾類,變量,方法,賦值以后不可改變。final修飾的成員變量必須顯示指定初始值。final修飾符指向的引用變量指向的地址不會發生改變,但是里面的對象內容可以發生改變。宏變量:定義final變量時就為該變量指定了初始值,而且編譯時已經確定值,那么這個final變量就相當于“宏變量”。final類不可以有子類。抽象類:abstract修飾,抽象類不能被實例化,無法使用new關鍵字調用抽象類的構造器創建實例。含有抽象類方法的類只能被定義成抽象類,抽象方法如abstract test();沒有方法體。abstract不能和static同時修飾某個方法;abstract修飾的方法必須被子類重寫,所以要定義為public。abstract類可以包含普通方法和抽象方法。接口:接口里所有方法都是抽象方法。接口里成員變量默認是使用public static final修飾的。接口主要用途:定義變量;調用接口中定義的常量;被其他類實現。枚舉類:關鍵字enum,地位與類,接口相同。Jar包,一種壓縮文件,將應用相關的類文件打包,供別人使用。添加jar包文件到classpath變量中,則Java虛擬機就可以自動在內存中解壓這個jar包,查找相關類。默認包含名為meta-inf/manifest。mf的清單文件。創建jar包:jar c(v)f ?test.jar test;查看jar包:jar t(v)f test.jar;解壓縮:jar v(v)f test.jar;更新jar包:jar u(v)f test.jar test.class
六。基礎類庫
public static void main(String[] args)static,JVM直接通過該類來調用主方法;void,主方法被JVM調用,因此返回值給jvm沒有任何意義。字符串數組形參:誰調用方法,誰負責賦值。使用scanner獲取鍵盤輸入,scanner是基于正則表達式的文本掃描器,可以從文件、輸入流、字符串中解析出基本類型和字符串。hasNextXXX()判斷是否有下一個輸入項;nextxxx()獲取下一個輸入項System類,Runtime類,代表java程序的運行時環境,每個java程序都有一個Runtime實例。可以通過getRuntime()獲取Runtime對象。String類是不可變類;StringBuffer可變,如append(),insert(),reverse(),setCharat(),setLength()改變對象的字符串序列,最終確定字符串以后,可以通過toString()方法轉換為string對象。String.toCharArray()將String對象轉換成char數組。String.valueOf(X x)各基本類轉換為String類。Math類;Random類,Random rand=new Random(System.currentTimeMillis)BigDecimal類,創建此類對象時,要直接用String類對象作為構造器參數,不要直接用double數字。Date類:Date()生成代表當前日期時間的Date對象,底層調用System。currentTimeMillis()獲得long整數作為日期參數。deprecated表示java不再推薦使用。Calender類是Date類的補充。正則表達式:
正則表達式必須先被編譯為Pattern對象,Pattern p=Pattern.compile("a.b");再利用Pattern對象創建Matcher對象,Matcher m=p.mattches("aaabbb");boolean b=m.matches,返回true;多個Matcher可共享同一個Pattern對象
Matcher.find(),返回目標字符串中是否包含與Pattern匹配的子串;Matcher.group()返回上一次與Pattern匹配的子串
java國際化,通過以下三個類完成,java.util.ResourceBundle,java.util.Locale(封裝特定的國家/區域,語言環境),java.text.MessageFormatMessageFormat處理包含占位符的字符串;NumberFormatDateFormat,SimpleDateFormat,處理日期格式化,Date date=Date.parse(String xxx),String sss=date.format(Date d);Java 8提供了新類;DateTimeFormatter合并兩者。
七。集合
保存不確定的數據,以及保存具有映射關系的數據,java提供了集合類,也稱為容器類,位于java.util包下。集合里只能保存對象(對象的引用變量)。Collection分為Set(無序集合)和List(有序集合),Queue類似List;Map類用于保存具有映射關系的數據,以key-value對表示。Set元素不能重復,且無法記住元素順序;List類似數組,可以記住存儲順序,且List長度可變;Map類似Set,只是每項數據由兩個值組成。Iterable借口的foreach方法可以用來遍歷集合元素,用Lambda表達式,程序會依次將集合元素傳遞給Consumer的accept(T t)方法。使用foreach循環遍歷集合元素for(Object obj:books)HashSet:向集合中存入元素,Hashset調用該對象的hashCode()方法得到hashcode值,根據這個值決定存儲位置。hashset集合判斷兩個元素相等的標準是兩個對象通過equals方法相等,并且hashcode也相等。LinkedHashset,TreeSet,Enumset都是set集合,符合set集合特性。ArraysList和Vector都是基于List的子類,基于數組實現。Queue用于模擬隊列這種數據結構LinkedList可以被當成雙端隊列來使用,因此既可以當“棧”使用,也可以當隊列使用。以鏈表形式存儲數據。Map類中key和value是一對一關系。Map的實現類和子接口中key集的存儲形式和對應Set集合中元素存儲的方式完全相同。Object put(Object key ,Object value)操作集合的工具類:Collections
八。泛型(相當凌亂中)
java集合有個缺點,把一個對象扔進集合里之后,集合就會忘記對象的類型。再次取出此對象時,該對象的編譯類型就變成了 Object(運行時類型未發生變化)。java引入了參數化類型的概念(parametized type),允許程序在創建集合時指定傳入參數的類型。這種類型稱為泛型generic菱形語法:List<String> books=new List<>()創建泛型聲明的自定義類,為該類定義構造器時,構造器名還是原來的類名,不要加泛型,如A類構造器是A,而不是A<T>泛型并不會生成真正的類,比如ArrayList<String>和ArrayList<Integer>實際上都是ArrayList類。不能在靜態變量聲明,靜態方法中使用類型形參使用類型通配符List<?> c表示泛型父類
九。異常捕獲
?
try,catch:執行try塊里的業務邏輯代碼時出現異常,系統自動生成一個異常對象,該對象被提交給運行時環境,這個過程稱為拋出異常。java運行時環境收到異常對象時,尋找合適的catch塊捕獲異常;找不到則運行時環境終止,程序退出。try塊對應的語句只能執行一個catch塊,try和catch中語句即便只有一條,花括號也不可以省略,if語句如果只有一條語句是可以省略花括號的。異常捕獲原則:先捕獲小異常,后捕獲大異常。多異常捕獲訪問異常信息使用throws聲明拋出異常:當前方法不知道如何處理,該異常又上一級調用者處理;如果main方法也不知道如何處理,使用throws聲明拋出異常,交給JVM處理,打印異常的跟蹤棧信息,終止程序運行。使用throw自行拋出異常(非系統拋出),拋出的是一個實例
十。mysql與JDBC
use database進入數據庫;show tables展示這個數據庫下有幾個表 ?use dev_fund_bh;SHOW TABLES;innoDb提供事務安全的存儲機制。truncate 刪除表中數據;drop刪除表;unique唯一約束,針對一列或者幾列數據進行約束,數據不能重復;主鍵約束相對應非空約束和唯一約束;check約束(mysql不支持)create index a_index on tablename(列名)視圖:create or replace view 視圖名 as subquery ,其實就是一條被命名的sql語句;視圖并不存儲數據select語句可以使用算術運算符進行篩選
用concat進行字符
串連接運算
?
select 列名 as 別名,或者select 列名 別名
between and ,expr in(1,2,3。。)expr=括號里任意一個表達式的值;=判斷相等,<>判斷不等,:=賦值_下劃線代表匹配一個字符,%匹配多個字符,\轉移字符邏輯運算符:and,or,not,優先級低于比較運算符數據庫函數:單行函數:select CURDATE();select curtime();case函數多行函數:min,max,sum,avg,distinct與*不可以同時使用,group by,having;having和where的區別:子查詢?
十一。Annotation 注釋
deprecated 已廢棄,@Documentation @override 覆蓋
十二。文件
輸入輸出流是根據程序運行所在內存的角度考慮的字節流:InputStream,OutputStream,八位字節;字符流:Reader,Writer,16位字符節點流,處理流
十三.多線程
每個運行中的程序就是一個進程。程序進入內存就變成了進程。并發性concurrency同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,宏觀上看起來是多個進程同時執行。并行性parallel同一時刻,有多條指令在多個處理器上同時執行。線程也被稱作輕量級進程lightweight process線程基類Thread線程狀態轉換后臺線程daemon Thread,在后臺運行,為其他線程提供服務,又稱為守護線程或者精靈線程。JVM的垃圾回收機制就是典型的后臺線程。如果所有前臺線程都死亡,后臺線程會自動死亡。通過setDameon(true)可將線程設置為后臺線程改變線程優先級setPriority() MAX_PRIORITY=10,MIN_PRIORITY=1,NORM_PRIORITY=5線程同步,通過同步監視器來解決,synchronized關鍵字;線程開始執行同步代碼塊之前,必須先獲得對同步監視器的鎖定。目的是阻止兩個線程對同一個共享資源進行并發訪問,如銀行賬戶Lock同步鎖死鎖線程通信:synchronized+wait(),notify(),notifyall(),這三個方法屬于Object,而不是Thread類;Lock+Condition;阻塞隊列BlockingQueue
十四。類加載機制與反射
系統會通過加載,連接,初始化三個步驟對類進行初始化。類加載:將類的class文件讀入內存,創建java.lang.Class對象類的加載類的連接:類的初始化類加載器:負責將.class文件(可能在磁盤,也可能在網絡上)加載到內存中,并自動生成對應的java.lang.Class對象。包括Bootstrap ClassLoader根類加載器,加載java核心類;Extension ClassLoader擴展類加載器,System ClassLoader系統類加載器UrlClassLoader通過反射查看類信息java.lang.reflect,如常用的get,set方法
總結:
1.學習了基礎,之前寫自動化只是參考常用方法,有不會的隨時百度,但是并沒有系統的學習;學習這本書了解了基礎知識,結合自身實際情況,感覺加深了寫代碼的印象;
2.其中主謂賓的概念更加強了我寫代碼時的了然于胸,不是胡寫一通了,之前思路大概是想到哪兒寫到哪兒,現在有點進步;
3.泛型,多線程,文件讀寫等更深層次的操作需要更多的學習以及練習
4.一定要多學習相關api,了解其中原理,才能更好的寫出自己想要的東西
?
?
?
?
?
總結
以上是生活随笔為你收集整理的java疯狂讲义 摘录的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。