摘要:
雖然已經在實際工作中與java打交道5年之多,但是一直沒系統(tǒng)地對java這門語言進行梳理和總結,掌握的知識也比較零散。恰好利用這段時間重新認識下java,并對一些常見的語法和知識點做個總結與回顧,一方面為了加深印象,方便后面查閱,一方面為了學好java打下基礎。
java語言于1995年正式推出,最開始被命名為Oak語言,由James Gosling(詹姆斯·高斯林)在Sun Microsystems公司和同事共同研發(fā),Microsystems如今已經被oracle收購。java語言具有以下特點:
簡單性
面向對象
可移植性
安全性
健壯性
多線程
Java文件運行過程如下:
編寫源代碼,文件格式: .java
編譯 .java文件 生成.class文件(二進制字節(jié)碼文件)
運行 .class文件在JVM上(java虛擬機,支持多平臺)
如果大家在學習過程中遇到什么問題,或者缺乏相關的Java學習資料,可查看右側公告欄獲取,有問題隨問隨答,還有我這段時間整理的一些Java學習手冊,面試題,開發(fā)工具,PDF文檔書籍教程,需要的話都可以免費分享給大家。言歸正傳:
?
注釋用于解釋程序,增強可讀性,java中注釋有以下幾種:
1.單行注釋,語法如下:
// 單行注釋
2.多行注釋,語法如下:
/*
多行注釋
多行注釋
*/
3.javadoc注釋,是一種專業(yè)注釋,可以被javadoc.exe工具解析提取生成幫助文檔
/**
* javadoc注釋
*/
標識符用于標識類名,方法名,變量名,接口名等,命名需要滿足以下規(guī)則:
只能由"數字,字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)"組成
所有的標識符都應該以字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)開始
嚴格區(qū)分大小寫,不能用關鍵字做標識符
java編程規(guī)范建議遵守駝峰命名法,類名和接口名首字母大寫,變量和方法名首字母小寫。Java采用unicode的編碼方式,所以標識符也支持中文。
java定義一個類用class關鍵字,有以下幾點需要注意:
一個java源文件定義公開的類只能有一個,類名稱必須和java源文件名稱一致
一個java源文件可以編寫多個class
每一個class都可以編寫main方法
數據類型的作用是指導JVM在運行程序的時候給該數據分配多大的內存空間,Java提供了以下八種基礎數據類型:
整型有三種表示方式,默認是十進制:
類型轉換有如下規(guī)則:
八種基本數據類型除了布爾類型之外,剩下的7種類型都可以互相轉換
小容量向大容量轉換,可以自動進行,容量從小到大排序為:
byte < short < int < long < float < double
大容量數據轉換成小容量,需要進行強制類型轉換,強轉會損失精度
byte, short ,char 混合運算,各自轉換成int;多種數據類型混合運算,轉換成容量最大的類型再運算。
對于強制類型轉換,將long強轉成int的語法如下:
long k = 6475201314L;
int num = (int) k;
注意:大容量轉換成小容量編譯無法通過,比如下面代碼無法編譯:
byte b = 19;
b = b + 13; // 相當于直接把整型賦值給byte型,報錯
b += 13; // 可以編譯,等同于 b = (byte)(b + 13)
在Java中使用String 類來創(chuàng)建和操作字符串,初始化一個String的語法如下:
// 常用,用雙引號直接創(chuàng)建
String testStr = "Wasting time is robbing oneself";
// 不常用,使用char數組創(chuàng)建
char[] helloArray = {'h', 'e', 'l', 'l', 'o'};
String helloString = new String(helloArray);
由于字符串使用非常頻繁,String類也提供了很多方法,下面介紹一些用的比較多的。
對字符串進行修改的常用方法有(包括格式化,大小寫轉換):
對字符串進行查找和替換的方法有:
獲取子字符串的常用方法有:
對字符串進行比較的方法有:
其他常見的方法比如統(tǒng)計長度,拼接,轉換等:
數組可以用于存放固定大小的同類型元素,聲明一個數組的語法如下:
變量類型[] 數組名;
創(chuàng)建數組的語法:
數組名 = new 變量類型[數組大小];
變量類型[] 數組名 = {value0, value1, ..., valuek};
數組的變量類型可以是前面介紹八種基本數據類型以及復合數據類型,“數組名[索引]” 可以訪問數組元素,下面是一個操作一維數組例子:
int[] primeNumbers = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
for (int num : primeNumbers) {
System.out.println("num: " + num);
}
操作二維數組的例子如下:
int[][] a = new int[2][3];
a[0][0] = 19;
String[][] s = new String[2][];
s[0] = new String[2]; // 第一個數組長度為2
s[1] = new String[3]; // 第二個數組長度為3
s[0][0] = "Hello";
s[0][1] = "World";
java.util.Arrays類能方便地操作數組,它提供的所有方法都是靜態(tài)的,比較常見的方法有:
使用Arrays的sort方法進行排序的例子如下:
int[] primeNumbers = {7, 11, 5, 2, 3};
Arrays.sort(primeNumbers);
for (int num : primeNumbers) {
System.out.println("num: " + num);
}
Java語言提供了一個完善的集合框架,主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射
經常用到的集合有:
ArrayList提供的常用方法有:
下面是操作一個java.util.ArrayList的例子:
ArrayList list = new ArrayList();
list.add(2);
list.add(3);
list.add(5);
for (int i = 0; i<list.size(); i++) {
System.out.println(list.get(i));
}
list.remove(1);
list.set(1, 19);
關于數據類型,最后再介紹下Java中常見的類型轉換方法:
Java的運算符種類比較多,本文介紹幾種常見的運算符:
java的算術運算符如下表(int a = 10; int b= 9;):
基本的賦值運算符"=" 可以與前5種算術運算符組合成 +=,-=,*=,/=,%=等擴展的賦值運算符
int a = 10; a += 5; 等價于 a = (int)(a + 5);
其他的運算符類似,擴展運算符默認有類型轉換,但是不改變運算結果類型
對于"+"運算符,只要兩邊的操作數有一個是字符串就會進行字符串連接運算生成一個新的字符串。
java中主要有以下六種關系運算符:
關系運算符返回的結果是布爾型
主要有以下三種邏輯運算符(boolean a = true; boolean b = false):
位運算符對兩個操作數的每一位進行運算,有以下幾種常見的類型:
三目元素符的語法規(guī)則:
布爾表達式 ? 表達式1 : 表達式2;
布爾表達式為真執(zhí)行表達式1,為假執(zhí)行表達式2,利用三目運算符求最大值的一個例子如下:
int a = 10;
int b = 9;
int max = (a > b) ? a : b;
System.out.println("max number is: " + max);
每種編程語言都少不了控制語句來控制代碼流程,java語言也提供了豐富的控制語句。
if語句常見的語法:
// 第一種寫法,else分支可以省略
if (布爾表達式) {
表達式為真要執(zhí)行的語句;
} else {
其他條件要執(zhí)行的語句
}
// 第二種寫法,最后的else分支可以省略
if (布爾表達式) {
表達式為真要執(zhí)行的語句;
} else if (布爾表達式1) {
表達式1為真要執(zhí)行的語句
} else if (布爾表達式2) {
表達式2為真要執(zhí)行的語句
} else {
除上述條件之外要執(zhí)行的語句
}
switch語句的語法如下:
switch (expression) {
case value1 :
// 匹配value1成功之后執(zhí)行的語句
break; // 可選
case value2 :
// 匹配value2成功之后執(zhí)行的語句
break; //可選
...
default : // 可選
// 前面case分支都沒匹配時執(zhí)行的語句
}
其中expression支持byte、short、int、char以及字符串(String),byte、short、char會轉換為int類型。程序只有遇到break語句才會跳出switch語句,缺少break的分支會繼續(xù)往下面分支執(zhí)行。
程序當中總會有些需要重復執(zhí)行的代碼片段,因此各個編程語言都支持循環(huán)語法。
for語句的語法如下:
for (初始化表達式; 布爾表達式; 更新表達式) {
// 要重復執(zhí)行的代碼片段
}
執(zhí)行過程:
初始化表達式最先執(zhí)行而且只執(zhí)行一次;
判斷布爾表達式,如果是真執(zhí)行循環(huán)體,如果是假則退出循環(huán)
循環(huán)體執(zhí)行之后更新表達式,再執(zhí)行步驟2,反復循環(huán)直到退出循環(huán)
利用for循環(huán)計算數字1到10的和的代碼如下:
int sum = 0;
for (int i = 0; i <= 10; i++) {
sum += i;
}
System.out.println("the sum is: " + sum);
while語句的語法如下:
while (布爾表達式) {
// 循環(huán)內容
}
執(zhí)行過程:
先判斷布爾表達式的值,為真就執(zhí)行循環(huán)體,為假則循環(huán)結束,循環(huán)體可能一次也不執(zhí)行。
使用while循環(huán)計算數字1到10的和是:
int sum = 0;
int i = 0;
while (i <=10) {
sum += i;
i++;
}
System.out.println("The sum is: " + sum);
do…while循環(huán)的語法如下:
do {
// 循環(huán)內容
} while (布爾表達式);
do…while循環(huán)先執(zhí)行循環(huán)內容再判斷表達式,循環(huán)體至少會執(zhí)行一次。
break使用在switch語句中終止switch執(zhí)行,使用在循環(huán)語句中終止循環(huán),跳出當前循環(huán)體。語法如下:
break;
continue表示直接進入下一次循環(huán)繼續(xù)執(zhí)行,語法如下:
continue;
在Java中,所有的變量在使用前必須聲明。聲明變量的基本格式如下:
type identifier = value;
value的數據類型必須和聲明的變量類型一致,變量的值可變化,必須先聲明再賦值才能訪問。
java中的局部變量聲明在方法內部,有以下特點:
變量只在作用域內有效,超出作用域變量將會被銷毀;
變量是在棧上分配,沒有默認值,所以局部變量被聲明后,必須經過初始化,才可以使用。
局部變量存儲在棧內存中。
成員變量在方法體之外聲明,有以下特點:
當一個對象被實例化之后,每個實例變量的值就跟著確定
實例變量在對象創(chuàng)建的時候創(chuàng)建,在對象被銷毀的時候銷毀
實例變量具有默認值,數值型變量的默認值是0,布爾型變量的默認值是false,引用類型變量的默認值是null。
成員變量在JVM的堆內存中存儲,垃圾回收器主要針對堆內存處理。
靜態(tài)變量用static關鍵字聲明,需要記住以下特點:
無論一個類創(chuàng)建了多少個對象,類只擁有靜態(tài)變量的一份拷貝
靜態(tài)變量在第一次被訪問時創(chuàng)建,在程序結束時銷毀。
靜態(tài)變量具有默認值,取值和實例變量類似
不同類型變量在JVM中的存儲情況如下表:
方法實質就是一段可以重復使用,完成某項特定功能的片段,和C語言中的函數類似。方法的語法如下:
[修飾符] 返回值類型 方法名(參數類型 參數名1, 參數類型 參數名2 ...) {
...
方法體;
...
return 返回值; // 可選,與返回值類型一致
}
比如常見的main方法如下:
public static void main(String []args) {
System.out.println("Hello World!");
}
方法有如下幾個部分組成:
修飾符:修飾符,這是可選的,定義了該方法的訪問類型。比如public, static, private, protected等
返回值類型 :方法可能會返回值,支持前面介紹的八種基本數據類型以及String,如果不需要返回值,返回值類型就寫成void。
方法名:是方法的實際名稱,建議首字母小寫。方法名和參數表共同構成方法簽名。
參數類型:即形參列表,形參的個數可以是:0~N個。當方法被調用時,傳遞值給對應參數,這個值被稱為實參。
方法體:方法體包含具體的語句,定義該方法的功能。
下面是實現判斷一個正整數是否是質數的函數的例子(假設num大于2):
private static boolean isPrimeNumber(int num) {
boolean isPrime = true;
for (int i = 2; i < num; i++) {
if (num % i == 0) {
isPrime = false;
break;
}
}
return isPrime;
}
方法代碼片段屬于.class字節(jié)碼文件的一部分,在調用方法的時候才會在棧中分配內存,稱為壓棧;方法執(zhí)行結束釋放方法的內存空間稱為彈棧。方法執(zhí)行完之后,方法內局部變量的空間也釋放,因此局部變量只在方法內有效。JVM的棧中主要存儲的是局部變量。
方法重載(overload)主要是是指方法名相同,參數列表不同,和返回值類型無關,和修飾符無關。要構成方法重載需要滿足以下條件:
方法是在同一個類當中
這些方法的方法名相同
參數列表不同,可以是數量不同,順序不同,類型不同
面向對象是Java核心的特點,主要有以下特性:
封裝:封裝就是隱藏實現細節(jié),僅對外提供訪問接口。優(yōu)點是使代碼模塊化,具有安全性。
繼承:繼承就是將已存在的類(父類)的定義作為基礎建立新類,新類(子類)的定義可以增加新的數據或新的功能,也可以用父類的功能
多態(tài):多態(tài)就是引用變量指向的具體類型和通過該引用變量發(fā)出的方法調用在編程時并不確定,而是在程序運行期間才確定。使得程序靈活地運行在多個狀態(tài)。
對象和類的定義:
對象(object):對象是類的一個實例,是實際存在的個體,有狀態(tài)和行為。
類(class):類是一個模板,它描述一類對象的行為和狀態(tài),是抽象思考的結果。
對象和類的關系:
一個類進行實例化就形成了對象,對象抽象形成類。
類的語法如下:
[修飾符列表] class 類名 {
屬性; // 對象的狀態(tài)信息,通常采用變量方式定義,稱為成員變量
方法; // 對象的動作信息
}
類實例化需要用new運算符,語法如下:
new 類名();
java中的類屬于引用數據類型,new新建的java對象存儲在JVM的堆內存中,new等號左側類的變量名存儲的是指向堆內存的地址。每個new出來的類的內存互相獨立。
Java面向對象中相關的重要知識點有:
構造方法:構造方法名稱與類名相同,無返回參數。構造方法在類初始化的時候調用,支持重載。類存在默認的無參構造方法。
this關鍵字:this指向當前對象的引用,"this.屬性名稱"或者"this.方法名稱"用于訪問本類的變量或者方法,在構造方法中使用"this();"語句訪問本類的構造方法。
static關鍵字:static修飾屬性表示靜態(tài)變量,修飾類的方法表明無需類的對象就可以調用此方法。
super關鍵字:super為對父類的引用,可以使用super來調用父類的屬性,方法,和構造方法。
final關鍵字:final修飾變量表示變量的值初始化后不能發(fā)生變化;final修飾方法表示不能被子類重寫;final修飾的類無法被繼承。
抽象類:抽象類使用abstract關鍵字聲明,非抽象類繼承抽象類必須實現所有抽象方法,抽象類不能被實例化。抽象類不能聲明為final。
instanceof關鍵字:instanceof 是用于檢查對象是否為指定的類型,通常在進行類型轉換時要使用,以避免發(fā)生類型轉換異常。
接口(Interface):接口是一個抽象類型,是抽象方法的集合。接口不是類,接口沒有構造方法,不能被實例化,只能被類實現。接口只能包含 static 和 final 變量。
Java中聲明一個接口的語法如下:
interface 接口名稱 [extends 其他的接口名] {
全局常量;
抽象方法;
}
接著介紹Java中使用非常頻繁的幾個函數:
控制臺的輸出由 print() 和 println() 完成。這些方法都由類 PrintStream 定義,System.out 是該類對象的一個引用。print()打印指定的字符不換行,println()打印完成換一行。
下面是使用的例子:
System.out.print("Remember: ");
System.out.println("Haste makes waste");
Java中使用java.util.Scanner類獲取用戶的輸入,使用前需要先創(chuàng)建Scanner對象。常用next() 與 nextLine() 方法獲取輸入的字符串,對應地用hasNext() 與 hasNextLine() 判斷是否還有輸入的數據。
下面是使用next函數獲取用戶輸入字符串的例子:
// 創(chuàng)建scanner對象
Scanner scan = new Scanner(System.in);
// 判斷是否還有輸入
if (scan.hasNext()) {
String inputStr = scan.next();
System.out.println("you input:" + inputStr);
}
// 關閉scanner
scan.close();
還可以使用nextInt接收一個整數,Scanner常用的方法如下表:
Java這門語言涵蓋的知識點比較豐富,一篇文章是不可能將所有知識點都完全覆蓋到的。本文的主要目的是梳理下基礎常見的知識點,幫助大家一起復習下,學習一門語言打好基礎是至關重要的。掌握了這些基礎知識點,自己動手寫一些小程序問題也不大。文章最后再附上一個完整代碼的小例子,實現的功能是將用戶輸入的字符串逆序輸出:
class Test{
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
String inputStr = scan.nextLine();
// String轉換為char數組
char[] nums = inputStr.toCharArray();
for (int i = nums.length; i>0; i--) {
System.out.print(nums[i-1]);
}
System.out.println("");
}
}
完結!撒花?。?!
聯系客服