1 java概述
開發服務器端應用程序最流行語言,產生網頁、運行后端邏輯。
當對java了解到一定程度,閱讀源碼才能解決問題。
Applet:在網頁中運行的java程序,
?
Java的應用領域:
桌面應用系統開發
企業級應用開發
多媒體系統開發
分布式系統開發
Web應用系統開發
?
Java SE 桌面應用程序開發
Java EE 企業級分布式的網絡程序?如電子商務網站、ERP(企業資源規劃)系統,核心為EJP(企業java組件模型)
Java ME 嵌入式系統開發
2 Eclipse快捷鍵
Ctrl + z 撤銷
Ctrl + y 反撤銷
Ctrl + d 刪除
Ctrl + Alt + 上/下 復制行
Alt + 上/下 移動行
Alt + * 代碼提示
Ctrl + / 注釋
Ctrl + F11 運行
Ctrl + Shift + O 自動導包
Ctrl + Alt + / ?關鍵字自動補全
Alt + / ?代碼輔助菜單 如syso
Ctrl + 1 ?代碼修正
Ctrl + m 放大視圖
Shift + Enter 新建一行
F5 ?單步跳入
F6 ?單步跳過
3 8種基本數據類型
整型 ?byte ?short ?int ?long ?占字節數1 2 4 8
浮點型 float ?double
字符型 2字節
布爾型
?
long型數字后加L/l
float型數字后加F/f
char 與 int可以相互顯式轉換
轉義字符
4 數值表示
加上前綴0b可以寫二進制:0b0010
為數字字面量加下滑線:1_000_000 或 0b0100_1101_0110_0000
下劃線只為易讀,編譯器會去掉這些下劃線。
數值類型所占內存與平臺無關,沒有無符號類型(unsigned)。
?
浮點數不適用于禁止出現舍入誤差的金融計算中,此時使用BigDecimal。
?
聲明常量:
final?數據類型常量名稱 [=值]
常量名稱大寫
為成員變量時必須賦初值
?
5 字符編碼UTF-16
代碼單元(code unit):16位
代碼點(code point):表示字符,兩種情況:
1基本字符:一個代碼單元;
2輔助字符:一對代碼單元。
強烈建議不使用char類型
?
6 變量名
Java中“字母”和“數字”的范圍更大。
使用Character類中的isJavaIdentifierStart和isJavaIdentifierPart方法進行檢測。
?
7 變量
成員變量
實例變量
靜態變量 static
局部變量
?
常量 final
?
8 控制臺輸入
Scanner in = new Scanner(System.in);
in.next(); 下一單詞
in.nextLine(); 下一行
in.nextInt();
in.nextDouble();
in.hasNext();
in.hasNextInt();
in.hasNextDouble();
?
控制臺讀取密碼
Console cons = System.console();
String username = cons.readLine(“User name: ”);
Char[] passwd = cons.readPassword(“Password: ”);
9 運算符
邏輯 與 ??或非
?????&& ?|| ?! ?
& 與 && 的不同:無短路
?
按位 與 或 取反 異或
?????& ?| ??~ ??^
?
左移 右移 無符號右移
?<< ??>> ?>>>
?
運算符優先級:
單目運算符
算術運算
比較運算
邏輯運算
賦值運算
?
可讀性第一,效率第二
程序中注釋要占程序代碼總量的20%-50%
程序的開發與維護不是同一個人,應盡量使用簡單的技術完成程序需要的功能。
?
10 格式化字符串
轉換符:
十進制 d
十六進制 x
浮點數 f
指數浮點數 e
字符串 s
字符 c
布爾 b
散列碼 h
日期時間 tx
與平臺有關的行分隔符 n
?
標志:
參數索引:$ 從1開始
格式化前面說明數值: <
?
String.format(); //創建格式化字符,但不輸出
?
11 文件輸入輸出
Scanner in = new Scanner(Paths.get(“C:\......”));
PrintWriter out = new PrintWriter(“myfile.txt”);
?
12 switch
case的標簽可以是:數值、枚舉常量、字符串字面量
?
switch(表達式)
{case 常量值1:語句塊1break;case 常量值2:語句塊2break;default:語句塊1
}
?
foreach語句
for(int x : array)
... ...
?
13 帶標簽的break與continue
標簽放在希望跳出的循環之前,緊跟冒號。
break跳到帶標簽語句塊末尾。
continue語句跳到與標簽匹配的循環首部。
?
14 字符串處理
不可變字符串:編譯器可以讓字符串共享。
共享帶來的高效率遠遠勝過提取、拼接字符串帶來的低效率。
String類 ??
下標從0開始
new 出來的是字符串變量
“?”?之間的是字符串常量
?
連接字符串:+
字符串長度:length()
字符串定位:indexOf(String s) ?lastIndexOf(String s)
獲取指定位置字符:charAt(int index)
獲取子串:substring(int beginIndex)
??Substring(int beginIndex, int endIndex)
去除前后空格:trim()
字符替換:replace(char oldChar, char newChar)
判斷頭尾:startsWith(String prefix) ?endsWith(String suffix)
判斷相等:equals(String str) ?equalsIgnoreCase(String str)
比較大小:compareTo(String str)
大小寫轉換:toLowerCase() ?toUpperCase() ?不影響數字和非字符
字符串分割:split(String sign) ?split(String sing, int limit) limit為分割次數
?
格式化字符串:
String類的靜態format()方法
(1)format(String format, Objects ...args)
(2)format(Local l, String format, Object ..args)
例子:
Date date = new Date();
String day = String.format(“%te”, date); 返回幾號
String hour = String.format(“%tH”, date); 返回小時
String time = String.format(“%tF”, date); 返回年月日
String str = String.format(“%d”, 400 / 2)?十進制
String str2 = String.format(“%b”, 3?> 5) ?布爾值
String str3 = String.format(“%x”, 200)???十六進制
?
正則表達式:符合一定規則的表達式。Pattern類
作用:用于專門操作字符串。
特點:用于一些特定的符號來表示一些代碼操作。這樣就簡化書寫。
所以學習正則表達式,就是在學習一些特殊符號的使用。
?
好處:可以簡化對字符串的復雜操作。
弊端:符號定義越多,正則越長,閱讀性越差。
?
具體操作功能:
1,匹配:String matches(regex)方法。用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false。
2,切割:String split(regex);
3,替換:String replaceAll(regex,str);
4,獲取:將字符串中的符合規則的子串取出。
?
操作步驟:
1,將正則表達式封裝成對象。
2,讓正則對象和要操作的字符串相關聯。
3,關聯后,獲取正則匹配引擎。
4,通過引擎對符合規則的子串進行操作,比如取出。
?
String str = "ming tian jiu yao fang jia le ,da jia。";
String reg = "\\b[a-z]{4}\\b";
?
Pattern p = Pattern.compile(reg); ?//將規則封裝成對象。
Matcher m = p.matcher(str); //讓正則對象和要作用的字符串相關聯。獲取匹配器對象。
?
?
//其實String類中的matches方法。用的就是Pattern和Matcher對象來完成的。
//只不過被String的方法封裝后,用起來較為簡單。但是功能卻單一。
//System.out.println(m.matches());
// boolean b = m.find();//將規則作用到字符串上,并進行符合規則的子串查找。
// System.out.println(b);
// System.out.println(m.group());//用于獲取匹配后結果。
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
?
字符串生成器
StringBuilder builder = new StringBuilder(“”);
append()
insert(int offset, arg)
delete(int start, int end)
toString()
?
15 數組
Java數組的維數可以接收變量;
數組的基本操作:
java.util.Arrays類
?
填充替換數組元素:
(1)fill(int[] a, int value)
(2)fill(int[] a, int fromIndex, int toIndex, int value)
?
對數組進行排序:
Arrays.sort() ?//優化的快速排序
?
復制數組:
Arrays.copyOf(arr, int newlength)
Arrays.copyOfRange(arr, int fromIndex, int toIndex)
?
二分查找:
Arrays.binarySearch(arr, key);
Arrays.binarySearch(arr, int fromIndex, int toIndex, key)
?
數組打印:
Arrays.toString(一維數組);
Arrays.deepToString(多維數組);
匿名數組 new int[]{1,2,3}
?
不規則數組:利用數組中存放的是對象指針的性質。
?
16 面向對象
Java是完全面向對象的。
類 class
構造 construct
實例 instance
實例域 instance field
方法 method
封裝 encapsulation 信息隱藏
繼承 inheritance
超類 Object
?
對象三個主要特性:
行為:behavior
狀態:state
標識:identity
?
編程中如何識別類:名詞為類,動詞為方法。
類之間的關系:
依賴:uses-a
聚合:has-a
繼承:is-a
統一建模語言:UML ??Unified Modeling Language
?
17 構造器(constructor)
特殊的方法,用來構造并初始化對象。
·構造器的名字與類名相同。
·可以有多個構造器
·可以有0、1、多個參數
·無返回值
·與new 操作符一起使用
所有java對象都是在堆中構造的,構造器總是伴隨著new操作符一起調用。
?
對象變量:是一個指向對象的指針。
對象:在內存中實際的實例。
一個對象變量并沒用實際包含一個對象,而僅僅引用一個對象。
在java中,任何對象變量的值都是對存儲在另一個地方的一個對象的引用。
New操作符的返回值也是一個引用。
所用的java對象都存儲在堆中,當一個對象包含另一個對象變量時,這個變量依然包含著指向另一個堆對象的指針。
?
更改器方法:mutator method
訪問器方法:accessor method
?
文件名必須與public類的名字相匹配。
在一個源文件中,只能有一個公有類,但可以有任意數目的非公有類。
當Java編譯器發現一個源文件使用了其他類時,會查找名為其他類.class的文件,如果沒有,則查找其他類.java文件并編譯。如果其他類.java較其他類.class新,則重新編譯其他類.java。
18 隱式參數與顯示參數
隱式參數(implicit):出現在方法名前的對象(this);
顯示參數(explicit):括號中的形參。
?
this的作用:
1、引用隱式參數
2、調用該類其他的構造器。
?
私有數據域
公有的域訪問器方法
公有的域更改器方法 ?不能編寫返回對象指針的訪問器方法,應返回其clone出來的新對象。
?
19 基于類的訪問權限
方法可以訪問所屬類的私有屬性(feature),而不僅限于訪問隱式參數的私有特性。
?
20 私有方法
私有方法為公有方法的輔助方法,外部不會出現依賴私有方法的代碼,可以刪除;
公有方法不能刪除。
?
21 final實例域
必須保證在每個構造器執行之后,這個域的值被設置。
final修飾符應用于基本(primitive)類型域,或不可變(immutable)類的域。
靜態方法不能使用this
?
22 靜態域與靜態方法
靜態域:類域,只存一份,對象共享
?
靜態常量:
public class Math
{
pubic static final double PI=3.14159265358...;
}
?
Public class System
{
public static final PrintStream out = ...;
}
?
靜態方法:沒有隱式this參數,不能向對象實施操作。
不能在靜態方法中訪問實例域。
使用類名調用靜態方法。
使用靜態方法的兩種情況:
1、不需要訪問對象狀態,參數通過顯示參數提供;
2、只需要訪問靜態域。
靜態方法的一個常見用途:工廠方法
?
對象名都是引用,存放地址
== 比較的是兩個對象的地址
System.gc()強制啟動垃圾回收器
?
單元測試技巧:每一個可以有一個main方法進行單元測試。
?
23 方法參數
按引用調用(call by reference)C++引用
按值調用(call by value)java全部是call by value
?
方法參數有兩種類型:
基本數據類型(數字、布爾)
對象引用(進行的是值傳遞)
?
總結:
一個方法不能修改一個基本數據類型的參數;
一個方法不能讓對象參數引用一個新的對象;
一個方法可以改變一個對象參數的狀態。
?
24 對象構造
重載(overloading):多個方法名字相同,參數不同。
調用過程首先重載解析(overloading resolution)。
方法簽名(signature):方法名+參數類型。
?
默認域初始化:0 ?null ?false ?無參默認構造函數的工作。
當類沒有提供任何構造器時,系統才提供一個默認的無參構造函數。
一個構造器中可以用this(參數)調用另一個構造器。
?
調用構造器的具體步驟:
1、初始化為默認值;
2、初始化塊;
3、如果這個構造器調用其它構造器,執行其它構造器
4、執行這個構造器。
?
對靜態域,使用靜態初始化塊。在類的第一次加載時執行。
不提供finalize析構方法。
?
25 包
包(package):將類組織起來。
確保類名唯一。
域名逆序為包名,不同項目使用不同子包。
?
一個類可以使用包中的所有類,以及其他包中的公有類(public class)。
?
靜態導入:導入靜態方法和靜態域
import static java.lang.system.*;
?
將包中的文件放到與完整的包名匹配的子目錄中。
編譯器將類文件也放在相同的目錄結構中。
?
編譯器對文件進行操作:javac com/mycompany/PayrollApp.java
????解釋器加載類:java com.mycompany.PayrollApp
?
包作用域:
如果類、方法、屬性沒有指定public或private,這個部分可以被同一個包中的所有方法訪問。即默認為包范圍的public。
?
禁止加載用戶自定義的,包名以“java.”開始的類。
包密封(package sealing)機制:(JAR)如果一個包密封起來,就不能向這個包中再添加類了。解決將各種包混在在一起的問題。
?
26 類路徑
類可以存儲在文件系統子目錄中,也可放在jar文件中。
?
為了使類能夠被多個程序共享,需要做到以下幾點:
1、把類放到一個目錄中,如/home/user/classdir;
2、將jar文件放在一個目錄中,如/home/user/archives;
3、設置類路徑class path。類路徑是所有包含類文件的路徑的集合。
?
如:java -classpath /home/user/classdir:.:/home/user/archives/archive.jar
或CLASSPATH環境變量。
虛擬機定位類文件:
1、jre/lib 和 jre/lib/ext;
2、依次在類路徑中查找。
?
編譯器定位文件:
1、查找當前包;
2、查找所有import的包,import次序無關緊要。
如果有多個同名類則報錯。
查看源文件(source file)是否比類文件新,如果是則重新編譯。
?
27 文檔注釋
javadoc 可以有源文件生成一個HTML文檔
/** ... */
?
注釋的插入:
javadoc實用程序(utility)從下面幾個特性抽取信息:
·包
·公有類與接口
·公有的和受保護的構造器及方法
·公有的和受保護的域
?
類注釋:import語句之后,類定義之前。
?
方法注釋:所描述方法之前
@parameter
@return
@throws
域注釋:對公有域,通常是靜態常量
?
通用注釋:
@author
@version
@since version 1.7.1
@deprecated ?不再使用標記,文本中給出了取代的建議。
@see引用 可用于類中,也可用于方法中。
package.class#feature label 只要提供類、方法或變量的名字,javadoc就在文檔中插入一個超鏈接。
@see com.horstmann.corejava.Employee#raiseSalary(double)
@see <a href=URL>The core java home page</a>
@link 同上,在注釋中的任何位置放置指向其他類或方法的超級鏈接。
?
包與概述注釋
包注釋,在包目錄中添加一個單獨的文件。
可以有兩個選擇:
1、提供一個以package.html命名的HTML文件,在標記<body>...</body>之間的文本都會被抽取出來;
2、提供一個以package-info.java命名的java文件。
???????????這個文件在包語句之后跟注釋 /** ... */
?
還可以為所有源文件提供一個概述性注釋。這個注釋放置在一個名為overview.html的文件中,這個文件位于所有源文件的父目錄中。所有在標記<body>...</body>之間的文本都會被抽取出來。
?
注釋的抽取:
1、切換到包含想要生成文檔的源文件目錄,此目錄包含包和overview.html;
2、運行命令 javadoc -d docDirectory nameOfPackage
Javadoc -author -version -d docDirectory nameOfPackage ?
在文檔中包含作者和版本信息(默認不包含)
Javadoc -link http://docs.oracle.com/javase/7/docs/api?*.java
所有的標準類庫類都會自動鏈接到Oracle網站de文檔。
-linksource選項:每個類和方法名將轉變為指向源代碼的超鏈接。
?
28 類設計技巧
1、數據一定私有;
2、一定要數據初始化;
3、不要在類中使用過多的基本類型;
4、不是所有的域都需要獨立的域訪問器和域更改器;
5、將職責過多的類進行分解;
6、類名和方法名能夠體現他們的職責。
類名:首字母大寫?名詞、形容詞+名詞、動名詞+名詞
訪問器get開頭,更改器set開頭。
?
?
29 包裝類
Number
BigDecimal ?BigInteger ?Byte ?Integer ?Long ?Short ?Double ?Float ?
Character
Boolean ??
30 數字格式化
java.text.DecimalFormat格式化數字
0 ?# ?. ?- ?, ?E ?% ?\u2030 ?\u00A4 ?‘
?
String pattern;
DecimalFormat myFormat = new DecimalFormat();
myFormat.applyPattern(pattern);
?
DecimalFormat myFormat = new DecimalFormat(pattern);
?
myFormat.format(value)
Value ?Pattern ?Output
123456.789 ?###,###.### ?123,456.789
123456.789 ?00000000.###kg ?00123456.789kg
123.78 ?000000.000 ?000123.780
0.789 ?#.###% ?78.9
123456.789 ?###.## ?123456.79
0.789 ?0.00\u2030 ?789.00%。
?
myFormat.setGroupingSize(2); ?設置分組大小
myFormat.setGroupingUsed(false); ?是否支持分組
?
數學運算
Math類
常量:
Math.PI
Math.E
三角函數方法:
double sin(double a)
double cos(double a)
double tan(double a)
double asin(double a)
double acos(double a)
double stan(double a)
double toRadians(double angdeg) 角度轉弧度
double toDegrees(double angrad) 弧度轉角度
指數函數方法
double log(double a)
double log10(double a)
double sqrt(double a)
double cbrt(double a)
double pow(double a, double b)
?
最大、最小、絕對值
max( ?, ?)
min( ?, ?)
abs( ?)
?
取整函數
double ceil(double a)
double floor(double a)
double rint(double a) ?double -> double四舍五入,五取偶數
int round(float a) ????float -> int
long round(double a) ?double -> long
31 隨機數
兩種方式產生隨機數
Math類的random()方法
Random類的產生各種數據類型的方法
?
Math.random() 產生double型隨機數范圍[0.0 - 1.0)
偽隨機數,當前時間作為偽隨機數的參數
(int)(Math.random()*n) ?[0 - n)
(int)(m + Math.random()*(m - n)) [m, m+n)
(char)(‘a’?+ Math.random()*(‘z’-’a’+1)) ?[a, z]
?
32 大數字運算
java.math.BigDecimal
33 控制臺鍵盤錄入
?Scanner?s?=?new?Scanner(System.in);//接受從鍵盤輸入的數值
??//receive?string
??String?str?=?s.next();//獲取輸入的參數
??
??//receive?integer
??Integer?i?=?s.nextInt();//接受一個int的輸入參數
??
??//receive?double
??Double?d?=?s.nextDouble();
?
Object類中的方法:getClass() ?toString() ?equals() ?clone()
?
對象向上轉型
對象向下轉型 判斷 myobject instanceof ExamleClass
?
34 接口???
implements interface
屬性:public static final
方法:public abstract
?
導入靜態成員 import static ...
35 Final
final 變量 ?不變修改
final 方法 ?不能重寫
final 類 ???不能繼承
36 內部類
成員內部類 ?局部內部類 ?匿名類
?
CLI ?Command Line User Interface
GUI ?Graphical User Interface
?
java.Awt
重量級控件
Abstract Window ToolKit 抽象窗口工具
需要調用本地系統方法實現 ?
?
javax.Swing
輕量級控件
在Awt基礎上建立,完全由Java實現 ?