4 基礎
4.1 注釋
comments
書寫注釋是非常好的習慣
Java中有三種注釋
- 單行注釋
- 多行注釋
- 文檔注釋
文檔注釋
/**
* @Author lee
*/
4.2 標識符
- 類名,變量名,方法名都被稱為標識符
- 標識符以字母,美元符,下划線開始
- 不能使用關鍵字作為方法名或者變量名...
- 大小寫敏感
- 可以使用中文作為變量名,但不建議
4.3 關鍵字
事先定義的,有特別意義的標識符,有時又叫保留字
String 不是關鍵字,String是一個類
4.4 數據類型
強類型語言
要求變量的使用嚴格符合規范,所有變量先定義再使用
弱類型語言
沒那么嚴格的要求,不必事先聲明,變量的類型也可能會變化
Java數據類型分為兩大類:基本類型和引用類型
基本類型
primitive type
- 數值類型
- 整數類型 byte 1,short 2,int 4,long 8 [字節]
- 浮點類型 float 4,double 8 [字節]
- 字符類型 char 2 [字節]
- 布爾類型 boolean 1 [位]
注意事項:
long num = 30L //之后要加L 一般用大寫以免混淆
float n = 50.1F //之后要加F
拓展
整數拓展
- 二進制 0b
- 八進制 0
- 十進制
- 十六進制 0x
浮點數拓展
//銀行面試題 業務里的錢怎么表示?
//使用BigDecimal 數學工具類
float f = 0.1F; //0.1
double d = 0.1; //0.1
System.out.println(f==d); //false
System.out.println(f); //0.1
System.out.println(f); //0.1
float f1 = 2323232323232323F;
float f2 = f1 + 1;
System.out.println(f==d); //true
- 浮點數是有限的,離散的,存在舍入誤差,是一個約數
- 最好完全避免使用浮點數
字符拓展
- 字符本質是數字,可以轉為數字
- 編碼 Unicode
- 轉義字符
類拓展 (此時,類還沒有講)
//類
String sa = new String("hello world");
String sb = new String("hello world");
String sc = "hello world";
String sd = "hello world";
System.out.println(sa == sb); //false
System.out.println(sc == sd); //true
引用類型
reference type
- 類
- 接口
- 數組
4.5 類型轉換
強制轉換:高到低
自動轉換:低到高
byte,short,char ---> int ---> long ---> float ---> double
低---------------------------------------------------------------->高
注意點:
- 不能對boolean值進行轉換
- 不能進行不相關類型的轉換
- 高轉低使用強制轉換
- 可能存在溢出或精度問題
JDK7 新特性 數字之間可以使用下划線分割
int money = 10_0000_0000;
System.out.println(money);//1000000000
4.6 變量常量
變量
Variable
- 類型:必須聲明類型
- 變量名:必須是合法的標識符
- 作用域:變量的有效范圍
變量可以分為三類:
- 類變量:獨立於方法之外的變量,用 static 修飾。
- 實例變量:獨立於方法之外的變量,不過沒有 static 修飾。從屬於對象,如果不初始化就是類型的默認值。
- 局部變量:類的方法中的變量。
public class Variable{
static int allClicks=0; // 類變量
String str="hello world"; // 實例變量
public void method(){
int i =0; // 局部變量
}
}
常量
Constant
-
初始化(initialize)之后不能再改變其值
-
其變量名一般用大寫
-
使用final關鍵字來定義
-
final是一個修飾符,修飾符不存在先后順序
命名規范
- 變量,方法,類名:見名知意
- 常量:大寫字母和下划線
- 類名:首字母大寫和駝峰原則
- 類成員變量:首字母小寫和駝峰原則
- 局部變量:首字母小寫和駝峰原則
- 方法名:首字母小寫和駝峰原則
4.7 運算符
- 算術運算符:+,-,*,/,%,++,--
- 關系運算符:>,<,>=,<=,==,!=
- 位運算符: &,|,^,~,<<,>>,>>>
- 邏輯運算符: &&,||,!
- 賦值運算符: = ,*= ......
- 其他運算符: ?:,instanceof
運算符優先級
4.8 包機制
為了更好地組織類,Java提供了包機制,用於區別類的命名空間
包語句的語法格式:
package pkg1[. pkg2[. pkge ...]];
一般用公司的域名倒置作為包名
使用import導入包
import package1[.package2...].(classname|*);
4.9 JavaDoc
JavaDoc命令是用來生成自己的API文檔的
參數信息
- @author 作者名
- @version 版本號
- @since 需要指明最早使用的JDK版本
- @param 參數名
- @return 返回值情況
- @throws 異常拋出情況
命令行生成
javadoc -encoding UTF-8 -charset UTF-8 DocTest.java
IDEA生成
Tools: Generate JavaDoc
Output directory: select folder
Local: zh_CN
Other command line arguments: -encoding utf-8 -charset utf-8
5 流程控制
5.1 用戶交互
Java為我們提供了用於程序和用戶交互的一個工具類,我們可以獲取用戶輸入。java.util.Scanner是Java5的新特性,我們可以使用Scanner來獲取用戶的輸入。
基本語法
Scanner scanner = new Scanner(System.in);
我們可以通過Scanner類的next()與nextLine()方法來獲取輸入的字符串。
一般來說,我們需要在使用前通過hasNext()和hasNextLine()來判斷是否還有輸入的數據。
//凡是屬於IO流的類,如果使用完不關閉會一直占用資源
scanner.close();
next()方法
- 一定要讀取到有效字符后才會結束輸入
- 對於有效字符之前的空白,next方法會自動將其去掉
- 對於有效字符之后的空白,next方法將其視為分隔符或結束符
- 所以next方法無法得到含空格的字符串
nextLine()方法
- 以Enter作為結束符,返回的是按下Enter之前的字符串
- 可以獲得含空格的字符串
Scanner進階
Scanner scanner = new Scanner(System.in);
//Scanner還有許多方法用來接受各種類型的數據
scanner.nextInt();
scanner.nextFloat();
5.2 順序結構
基本結構,沒有特殊聲明就順序一條一條執行
5.3 選擇結構
if
單選擇 if
雙選擇 if else
多選擇
嵌套
switch
多選擇
switch case 語句判斷一個變量與一系列值中的某一個是否相等,每個值稱為一個分支。
其中的變量類型可以是
- byte,short,int,char
- 從Java SE7 開始支持String
- case標簽必須為字符串常量或字面量
int i = 10;
switch(i){
case 1:
//語句
break;
case 2:
//語句
break;
default:
//語句
}
break
跳出
continue
跳過本次
goto
goto雖然是Java的保留字,但是沒有在正式語言中得到應用
Java沒有goto
帶標簽的break和continue
標簽:標識符后面跟一冒號 如:lable:
break,continue通常只中斷當前循環,隨標簽一起使用會中斷到標簽處
對於Java來說唯一用到標簽的地方是在循環語句之前。在循環語句之前設置標簽的唯一理由是:我們希望在其中嵌套另一個循環。
int count = 0; //輸出101 到 150 之間的所有素數 outer: for (int i =101;i<150;i++){ for (int j=2;j<i/2;j++){ if(i%j==0) continue outer; } System.out.println(i + " "); }
5.4 循環結構
while
while(i<100){
System.out.println(i++);
}
do...while
do{
System.out.println(i++);
}while(i<100)
相比於while循環,即使條件不滿足也會執行一次,即do...while保證代碼至少也會執行一次
for
for(int i=0;i<100;i++){
System.out.println(i);
}
for更適合循環次數在執行前就已經知道的情況,如果不知道可以使用while或者do...while
增強for
主要用於遍歷數組和集合對象
for(int number:numbers){
System.out.println(number);
}
5.5 練習
打印九九乘法表
for (int i = 1;i <=9;i++){
for(int j = 1;j<=i;j++){
System.out.print(i+ "*"+j+"="+i*j+"\t");
}
System.out.println();
}
打印三角形
public class Triangle {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
for (int j = 5;j>=i;j--){
System.out.print(" ");
}
for (int j = 1;j<=i;j++){
System.out.print("*");
}
for (int j = 1;j<i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
6 方法
6.1 什么是方法
Java方法是語句的集合,放在一起完成一個功能
解決一個問題的步驟的有序組合
方法設計原則
一個方法只完成一個功能 方法的原子性
6.2 方法的定義及調用
方法的定義
方法包含一個方法頭和一個方法體
- 修飾符:修飾符,這是可選的,告訴編譯器如何調用該方法。定義了該方法的訪問類型。
- 返回值類型 :方法可能會返回值。returnValueType 是方法返回值的數據類型。有些方法執行所需的操作,但沒有返回值。在這種情況下,returnValueType 是關鍵字void。
- 方法名:是方法的實際名稱。方法名和參數表共同構成方法簽名。
- 參數類型:參數像是一個占位符。當方法被調用時,傳遞值給參數。這個值被稱為實參或變量。參數列表是指方法的參數類型、順序和參數的個數。參數是可選的,方法可以不包含任何參數。
- 方法體:方法體包含具體的語句,定義該方法的功能。
修飾符 返回值類型 方法名(參數類型 參數名){
...
方法體
...
return 返回值;
}
方法的調用
調用方法:對象名.方法(實參列表)
Java支持兩種調用方法
-
當方法有返回值時,方法調用通常被當作一個值
int larger = max(30,40);
-
當方法返回值為void時,方法調用是一條語句
System.out.println("Hello world!");
值傳遞
值傳遞(pass by value)是指在調用方法時將實際參數復制一份傳給方法,這樣在方法中對參數進行修改將不會影響到參數
Java是值傳遞
引用傳遞
引用傳遞(pass by reference)是指在調用方法時將實際參數的地址直接傳給方法,這樣在方法中對參數進行修改將會影響到參數
區別
根本區別:是否創建副本(copy)
值傳遞和引用傳遞的區別並不是傳遞的內容。而是實參到底有沒有被復制一份給形參。在判斷實參內容有沒有受影響的時候,要看傳的的是什么,如果你傳遞的是個地址,那么就看這個地址的變化會不會有影響,而不是看地址指向的對象的變化。就像鑰匙和房子的關系。
你有一把鑰匙,當你的朋友想要去你家的時候,如果你直接把你的鑰匙給他了,這就是引用傳遞。這種情況下,如果他對這把鑰匙做了什么事情,比如他在鑰匙上刻下了自己名字,那么這把鑰匙還給你的時候,你自己的鑰匙上也會多出他刻的名字。
你有一把鑰匙,當你的朋友想要去你家的時候,你復刻了一把新鑰匙給他,自己的還在自己手里,這就是值傳遞。這種情況下,他對這把鑰匙做什么都不會影響你手里的這把鑰匙。
但是不管上面的情況,如果你的朋友拿着你給他的鑰匙進你家,把電視砸了,這就產生影響了。但鑰匙還是鑰匙,判斷值傳遞還是引用傳遞時,你看的是鑰匙,而不是房子里的其他東西。
注意:
關於Java值傳遞,引用傳遞的相關知識在面試中也經常會被問到,注意理解。
6.3 方法重載
什么是重載
在一個類中,方法名相同,但是參數不同
重載規則
- 方法名必須相同
- 參數列表必須不同
- 參數個數不同
- 參數類型不同
- 參數排列順序不同
- 方法返回類型可以相同也可以不同
- 僅僅返回值類型不同不能成為方法的重載
6.4 命令行傳參
運行程序前再傳參數給它,傳遞命令行參數給main()函數實現
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
運行這個程序,結果如下所示:
$ javac CommandLine.java
$ java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
6.5 可變參數
JDK 1.5 開始,Java支持傳遞同類型的可變參數給一個方法。
方法的可變參數的聲明如下所示:
typeName... parameterName
一個方法中只能指定一個可變參數,它必須是方法的最后一個參數。
public class VarargsDemo {
public static void main(String args[]) {
// 調用可變參數的方法
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
}
public static void printMax( double... numbers) { // 可變參數
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double 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);
}
}
6.6 遞歸
什么是遞歸
方法自己調用自己
遞歸可以用來將一些復雜大規模問題轉換成一些小規模類似問題
遞歸可以寫成循環
遞歸結構
- 遞歸頭:什么時候不調用自身,即規模小到可以直接解決。沒有的話會死循環。
- 遞歸體:什么時候調用自身。
能不用遞歸就不用遞歸,棧的空間使用完就會出錯。