java學習筆記(持續更新)
java學習筆記
一、Java 基礎語法(學習於菜鳥教程)
1、第一個java程式
下面看一個簡單的 Java 程式,它將列印字串 Hello World
public class test1 {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
執行結果:
2、 基本語法
編寫 Java 程式時,應注意以下幾點:
- 大小寫敏感:Java 是大小寫敏感的,這就意味著識別符號 Hello 與 hello 是不同的。
- 類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單片語成,那麼每個單詞的首字母應該大寫,例如 MyFirstJavaClass
- 方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫。
- 原始檔名:原始檔名必須和類名相同。當儲存檔案的時候,你應該使用類名作為檔名儲存(切記 Java 是大小寫敏感的),檔名的字尾為 .java。(如果檔名和類名不相同則會導致編譯錯誤)。
- 主方法入口:所有的 Java 程式由 public static void main(String[] args) 方法開始執行。
3、 Java 識別符號
Java 所有的組成部分都需要名字。類名、變數名以及方法名都被稱為識別符號。
關於 Java 識別符號,有以下幾點需要注意:
- 所有的識別符號都應該以字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)開始
- 首字元之後可以是字母(A-Z 或者 a-z),美元符($)、下劃線(_)或數字的任何字元組合
- 關鍵字不能用作識別符號
- 識別符號是大小寫敏感的
- 合法識別符號舉例:age、$salary、_value、__1_value
- 非法識別符號舉例:123abc、-salary
4、 Java修飾符
像其他語言一樣,Java可以使用修飾符來修飾類中方法和屬性。主要有兩類修飾符:
- 訪問控制修飾符 : default, public , protected, private
- 非訪問控制修飾符 : final, abstract, static, synchronized
在後面的章節中我們會深入討論 Java 修飾符。
5、 Java 變數
Java 中主要有如下幾種型別的變數
- 區域性變數
- 類變數(靜態變數)
- 成員變數(非靜態變數)
6、 Java 陣列
陣列是儲存在堆上的物件,可以儲存多個同類型變數。在後面的章節中,我們將會學到如何宣告、構造以及初始化一個數組。
7、 Java 列舉
Java 5.0引入了列舉,列舉限制變數只能是預先設定好的值。使用列舉可以減少程式碼中的 bug。
例如,我們為果汁店設計一個程式,它將限制果汁為小杯、中杯、大杯。這就意味著它不允許顧客點除了這三種尺寸外的果汁。
例項:
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String[] args){
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
}
}
8、 Java 空行
空白行或者有註釋的行,Java 編譯器都會忽略掉。
二、 Java 物件和類
1、Java作為一種面嚮物件語言。
支援以下基本概念:
多型 繼承 封裝
抽象 類 物件
例項 方法 過載
2、java中的類
3、import 語句
在 Java 中,如果給出一個完整的限定名,包括包名、類名,那麼 Java 編譯器就可以很容易地定位到原始碼或者類。import 語句就是用來提供一個合理的路徑,使得編譯器可以找到某個類。
例如,下面的命令列將會命令編譯器載入 java_installation/java/io 路徑下的所有類
import java.io.*;
三、Java 基本資料型別
1、 內建資料型別
Java語言提供了八種基本型別。六種數字型別(四個整數型,兩個浮點型),一種字元型別,還有一種布林型。
byte:
- byte 資料型別是8位、有符號的,以二進位制補碼錶示的整數;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 預設值是 0;
- byte 型別用在大型陣列中節約空間,主要代替整數,因為 byte 變數佔用的空間只有 int 型別的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short 資料型別是 16 位、有符號的以二進位制補碼錶示的整數
- 最小值是 -32768(-2^15);
- 最大值是 32767(2^15 - 1);
- Short 資料型別也可以像 byte 那樣節省空間。一個short變數是int型變數所佔空間的二分之一;
- 預設值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 資料型別是32位、有符號的以二進位制補碼錶示的整數;
- 最小值是 -2,147,483,648(-2^31);
- 最大值是 2,147,483,647(2^31 - 1);
- 一般地整型變數預設為 int 型別;
- 預設值是 0 ;
- 例子:int a = 100000, int b = -200000。
long:
- long 資料型別是 64 位、有符號的以二進位制補碼錶示的整數;
- 最小值是 -9,223,372,036,854,775,808(-2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 這種型別主要使用在需要比較大整數的系統上;
- 預設值是 0L;
- 例子: long a = 100000L,Long b = -200000L。
"L"理論上不分大小寫,但是若寫成"l"容易與數字"1"混淆,不容易分辯。所以最好大寫。
float:
- float 資料型別是單精度、32位、符合IEEE 754標準的浮點數;
- float 在儲存大型浮點陣列的時候可節省記憶體空間;
- 預設值是 0.0f;
- 浮點數不能用來表示精確的值,如貨幣;
- 例子:float f1 = 234.5f。
double:
- double 資料型別是雙精度、64 位、符合IEEE 754標準的浮點數;
- 浮點數的預設型別為double型別;
- double型別同樣不能表示精確的值,如貨幣;
- 預設值是 0.0d;
- 例子:double d1 = 123.4。
boolean:
- boolean資料型別表示一位的資訊;
- 只有兩個取值:true 和 false;
- 這種型別只作為一種標誌來記錄 true/false 情況;
- 預設值是 false;
- 例子:boolean one = true。
char:
- char型別是一個單一的 16 位 Unicode 字元;
- 最小值是 \u0000(即為0);
- 最大值是 \uffff(即為65,535);
- char 資料型別可以儲存任何字元;
- 例子:char letter = 'A';。
2、引用型別
- 在Java中,引用型別的變數非常類似於C/C++的指標。引用型別指向一個物件,指向物件的變數是引用變數。這些變數在宣告時被指定為一個特定的型別,比如 Employee、Puppy 等。變數一旦聲明後,型別就不能被改變了。
- 物件、陣列都是引用資料型別。
- 所有引用型別的預設值都是null。
- 一個引用變數可以用來引用任何與之相容的型別。
- 例子:Site site = new Site("Runoob")。
3、 Java 常量
常量在程式執行時是不能被修改的。
在 Java 中使用 final 關鍵字來修飾常量,宣告方式和變數類似:
final double PI = 3.1415927;
雖然常量名也可以用小寫,但為了便於識別,通常使用大寫字母表示常量。
字面量可以賦給任何內建型別的變數。例如:
byte a = 68;
char a = 'A'
byte、int、long、和short都可以用十進位制、16進位制以及8進位制的方式來表示。
當使用字面量的時候,字首 0 表示 8 進位制,而字首 0x 代表 16 進位制, 例如:
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
和其他語言一樣,Java的字串常量也是包含在兩個引號之間的字元序列。下面是字串型字面量的例子:
"Hello World"
"two\nlines"
"\"This is in quotes\""
字串常量和字元常量都可以包含任何Unicode字元。例如:
char a = '\u0001';
String a = "\u0001";
四、字元和字串(此章之後轉廖雪峰網站學習)練習題問題解決
可以直接用轉義字元\u
+Unicode編碼來表示一個字元:
public class test4 {
public static void main(String[] args) {
char c1 = '\u0041'; // 'A',因為十六進位制0041 = 十進位制65
char c2 = '\u4e2d'; // '中',因為十六進位制4e2d = 十進位制20013
System.out.println("\\u0041:"+c1);
System.out.println("\\u4e2d:"+c2);
}
}
如,"abc"xyz"
,編譯器就無法判斷中間的引號究竟是字串的一部分還是表示字串結束。這個時候,我們需要藉助轉義字元\
:
String s = "abc\"xyz"; // 包含7個字元: a, b, c, ", x, y, z
常見的轉義字元包括:
\"
表示字元"
\'
表示字元'
\\
表示字元\
\n
表示換行符\r
表示回車符\t
表示Tab\u####
表示一個Unicode編碼的字元
從Java 13開始,字串可以用"""..."""
表示多行字串(Text Blocks)了。舉個例子:public class Main {
public static void main(String[] args) {
String s = """
SELECT * FROM
users
WHERE id > 100
ORDER BY name DESC
""";
System.out.println(s);
}
}
因為我安裝的是jdk1.8所以會出現下列情況:
1、不可變特性
Java的字串除了是一個引用型別外,還有個重要特點,就是字串不可變。
執行String s = "hello";
時,JVM虛擬機器先建立字串"hello"
,然後,把字串變數s
指向它:
s
│
▼
┌───┬───────────┬───┐
│ │ "hello" │ │
└───┴───────────┴───┘
緊接著,執行s = "world";
時,JVM虛擬機器先建立字串"world"
,然後,把字串變數s
指向它:
s ──────────────┐
│
▼
┌───┬───────────┬───┬───────────┬───┐
│ │ "hello" │ │ "world" │ │
└───┴───────────┴───┴───────────┴───┘
原來的字串"hello"
還在,只是我們無法通過變數s
訪問它而已。因此,字串的不可變是指字串內容不可變。
2、空值null
與c語言不同然後只是和c語言一樣定義int a這種,a不是隨機值而是
null。
特例:
String s4 = ""; // s4指向空字串,不是null
練習
請將一組int值視為字元的Unicode編碼,然後將它們拼成一個字串
程式碼如下:
public class test4 {
public static void main(String[] args) {
char c1 = '\u0041'; // 'A',因為十六進位制0041 = 十進位制65
char c2 = '\u4e2d'; // '中',因為十六進位制4e2d = 十進位制20013
System.out.println("\\u0041:"+c1);
System.out.println("\\u4e2d:"+c2);
int a = 72;
int b = 105;
int c = 65281;
// FIXME:
String s = ""+(char)a + (char)b + (char)c;
System.out.println(s);
String s1 = (char)a + (char)b + (char)c +""; // 65458
System.out.println(s1);
}
}
String s = ""+(char)a + (char)b + (char)c;
System.out.println(s);
String s1 = (char)a + (char)b + (char)c +""; // 65458
System.out.println(s1);
結果不同的原因:
1、先做 char型別的加法,然後再+空字串的,所以最後的結果就是字串"65458"
2、 是先轉換成字串,再把char型別加到字串中的
第二種可以改為:
String s = String.format("%c%c%c", a, b, c);
為什麼加”“
(char)a +(char)b +(char)c 執行的是 char 與 char 的加運算,結果還是 char 型別,無法賦值給 String 型別的 s。
五、陣列型別
1、陣列初體驗
程式碼:
int[] ns = new int[5];
ns[0] = 68;
ns[1] = 79;
ns[2] = 91;
ns[3] = 85;
ns[4] = 62;
int i =0;
for (i=0;i<=4;i++) {
System.out.println(ns[i]);
定義一個數組型別的變數,使用陣列型別“型別[]”,例如,int[]
。和單個基本型別變數不同,陣列變數初始化必須使用new int[5]
表示建立一個可容納5個int
元素的陣列。
Java的陣列有幾個特點:
- 陣列所有元素初始化為預設值,整型都是
0
,浮點型是0.0
,布林型是false
; - 陣列一旦建立後,大小就不可改變。
可以用陣列變數.length
獲取陣列大小:
System.out.println(ns.length); // 5
六、流程控制
1、輸出
print為直接輸入而printf為輸入後換行
2、格式化輸出
Java的格式化功能提供了多種佔位符,可以把各種資料型別“格式化”成指定的字串:
佔位符 | 說明 |
---|---|
%d | 格式化輸出整數 |
%x | 格式化輸出十六進位制整數 |
%f | 格式化輸出浮點數 |
%e | 格式化輸出科學計數法表示的浮點數 |
%s | 格式化字串 |
3、輸入
String name = scanner.nextLine(); // 讀取一行輸入並獲取字串
int age = scanner.nextInt(); // 讀取一行輸入並獲取整數
4、練習
請幫小明同學設計一個程式,輸入上次考試成績(int)和本次考試成績(int),然後輸出成績提高的百分比,保留兩位小數位(例如,21.75%)。
Scanner scanner1 = new Scanner(System.in);
System.out.print("小明請輸入上次的成績:");
int new_chengji = scanner1.nextInt();
System.out.print("小明請輸入這次的成績:");
int old_chengji = scanner1.nextInt();
double percent = 100*((double)old_chengji -(double)new_chengji)/new_chengji;
System.out.printf("成績提高了:%.2f%%",percent);