日期 | 說明 |
---|---|
2021/01/31 | 讀完了第一遍叁熔,邊讀邊記蔑担,看的比較隨意吏廉,除了第一第二章外艰匙,有些難的或者偏也都直接跳過了??,看第二遍的時候再補回來吧 maybe傻工。 |
概述
- 第 1 章 + 第 2 章 : 這兩章介紹了一些東西回右,比如Java的發(fā)展歷史啊境钟,Java的特性啊令花,以及Java的運行環(huán)境等等阻桅。特別要說的是,Java是一門面向?qū)ο?/strong>程序設(shè)計語言兼都,程序設(shè)計語言的成功取決于是否可以實現(xiàn)需要的功能嫂沉,而不是語法的精巧性。以及JDK(Java Development Kit:Java開發(fā)工具包)與JRE(Java Runtime Environment:Java運行時環(huán)境)
- 第 3 章 Java的基本程序設(shè)計結(jié)構(gòu):這一章講了Java的一些基礎(chǔ)知識扮碧,比如注釋啊趟章,8 種基本類型啊(int,short,long,byte,double,float,boolean,char),變量(如何聲明尤揣,初始化變量)與常量搔啊,運算符(其中還提到了短路的概念)柬祠,介紹了字符串北戏,輸入輸出等(這一節(jié)其實還講了Math的一些靜態(tài)方法,不過我覺得不是很重要漫蛔,需要的時候可以查嘛嗜愈,所以這里就不記錄了)
- 第 4 章 對象與類:這一章介紹了面向?qū)ο笏枷耄€有類與對象的關(guān)系莽龟,說了面向?qū)ο蟮囊恍┨匦匀浼蓿约白远x類的一些內(nèi)容,還有使用構(gòu)造器時代碼的執(zhí)行順序
第 3 章 Java的基本程序設(shè)計結(jié)構(gòu)
1.第一個程序
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
說明
-
public
(訪問修飾符) 用于控制對所修飾的類或?qū)ο蠡蜃侄蔚?strong>訪問級別 - class表示這是一個類毯盈,Hello則是這個類的類名
- main方法是所有程序的入口
- 大括號表示方法體的開始與結(jié)束
2.注釋
//單行注釋
/*
多行注釋剃毒,(不能嵌套使用)
*/
/**
* 文檔注釋
* 可用于自動的生成文檔
*/
3.數(shù)據(jù)類型
基本類型 | 位數(shù) | 字節(jié) | 默認值 |
---|---|---|---|
int |
32 | 4 | 0 |
short |
16 | 2 | 0 |
long |
64 | 8 | 0L |
byte |
8 | 1 | 0 |
char |
16 | 2 | 'u0000' |
float |
32 | 4 | 0f |
double |
64 | 8 | 0d |
boolean |
1 | false |
4.變量與常量
變量
聲明變量
int a;
String name;
即 以變量類型
變量名
這種形式來聲明一個變量
變量初始化
聲明一個變量后,必須用賦值語句對變量進行顯式初始化搂赋,如下
int a = 0;
String name = "任我行";
常量
常量就是值不會變的變量
可用final
關(guān)鍵字來修飾常量赘阀,而且通常此常量名為大寫
public final String BAIDU_URL = "www.baidu.com";
枚舉類型
作用:限制變量的取值范圍
如下:
enum Size {SMALL,MEDIUM,LARGE,EXTRA_LARGE};
那么Size
類型的變量只能取里邊的值
5.運算符
算術(shù)運算符
算術(shù)運算符 | 表示 |
---|---|
+ |
加 |
- |
減 |
* |
乘 |
/ |
除 |
% |
取模 |
類型轉(zhuǎn)換
- 如參與運算的兩個數(shù)類型不一致,則結(jié)果為較大類型的整型
- 強制轉(zhuǎn)換:(有可能損失信息)
其他運算符
- 二元運算符:例如
x+=4;
脑奠,運算符放于等號左邊 - 自增自減運算符
-
++x
前綴形式會先加1再使用 -
x++
后綴形式會先使用原來的值基公,之后才加1
-
- 關(guān)系運算符:如
==
,!=
,>=
之類的宋欺,還有&&
和||
- 三元運算符:
x>0 ? true : false
如表達式為真轰豆,則為true
,如假則為false
短路(&&
和||
運算符的邏輯)
如果第一個操作數(shù)已經(jīng)能夠確定表達式的值齿诞,第二個操作數(shù)就不必再計算了
6.字符串
這一節(jié)其實感覺沒有什么好記的酸休。。祷杈。
String hello = "Hello";
// 取子串
String s = hello.substring(0,3);// Hel
// 判斷是否相等
if(hello.equals("Hello")){
//....
}
// 構(gòu)建字符串
StringBuilder builder = new StringBuilder();
builder.append("builder");
builder.append("str");
String builderString = builder.toString();
System.out.println(builderString);
7.輸入與輸出
輸入
Scanner input=new Scanner(System.in);
System.out.printf("請輸入一個數(shù)字: ");
int num=input.nextInt();//輸入
System.out.println("你輸入的數(shù)字是:"+num);//輸出
輸出
System.out.print("普通輸出");
System.out.println("輸出后換行");
System.out.printf("格式化輸出 %.2f", 10000.0 / 3.0);
8.控制流程
條件分支流程
普通分支語句
int a = 1;
int b = 2;
if (a > b) {
System.out.println("a大于b");//如果a大于b則執(zhí)行這個語句
} else if (a == b) {
System.out.println("a等于b");//如果a等于b則執(zhí)行這個語句
} else {
System.out.println("a小于b");//否則就a小于b雨席,當以上兩種情況都不是的時候執(zhí)行
}
條件多分支語句
int g=2;
switch(g) {
case 1:{
System.out.println("是1");//當g是1時執(zhí)行
break;
}
case 2:{
System.out.println("是2");//當g是2時執(zhí)行
break;
}
default:{
System.out.println("都不是");//當以上情況都不是的時候執(zhí)行
break;
}
}
循環(huán)流程
根據(jù)條件,反復執(zhí)行某些操作
for
for(int i=0;i<5;i++) {//int i=0是初始值吠式,i<5是循環(huán)條件陡厘。i++是循環(huán)后更新i的值,然后進入下一輪循環(huán)
System.out.println("循環(huán)第"+i+"次");
}
while
int u=5;
while(u>0) {//當為true時執(zhí)行
System.out.println("u="+u);
--u;
}
do
..while
int p=0;
do {//無條件進入循環(huán)
++p;
System.out.println("p="+p);
}while(p<5);//首先執(zhí)行一次循環(huán)體后進行判斷特占,若為true則繼續(xù)進行下去
for each
(增強型for
循環(huán))
for ( 類型 變量名: 數(shù)組或集合 ) {
循環(huán)體
}
與普通for循環(huán)的區(qū)別:for each循環(huán)語句的循環(huán)變量將會遍歷數(shù)組中的每個元素糙置,而不是下標值
中斷控制流程的語句
break:跳出一個switch case 或者一個循環(huán)
帶標簽的break:
int a = 1;
read_data: // 標簽名(放在希望跳出的最外層的循環(huán)之前),后面跟著冒號
while (true) {
if (a == 1) break read_data;// break后要帶著標簽
System.out.println("in");
}
// 當里邊發(fā)生了break read_data就會跳到下面這個語句
System.out.println("out");
主要用在一些嵌套很深的循環(huán)語句中是目,希望發(fā)生失誤后完全跳出循環(huán)體
continue:將控制轉(zhuǎn)移到最內(nèi)層循環(huán)的首部
9.大數(shù)
-
BigInteger
實現(xiàn)任意精度的整數(shù)運算 -
BigDecimal
實現(xiàn)任意精度的浮點數(shù)運算
10.數(shù)組
- 存儲一組具有相同數(shù)據(jù)類型的數(shù)據(jù)元素的有序集合
- 用
new
操作符創(chuàng)建數(shù)組谤饭,整數(shù)類型的所有元素初始化為0,boolean類型的初始化為false,對象類型的則初始化為null - 數(shù)組一旦被創(chuàng)建揉抵,長度就不能修改了
// 聲明
int num[];
int[] sum;
// 靜態(tài)初始化
int num[]={1,2,3,4,5}
//動態(tài)初始化
int num[]=new int[5];//預先分配內(nèi)存空間
for(int i=0;i<5;i++){
num[i]=i*3;
}
第 4 章 對象與類
1.面向?qū)ο?/h3>
-
面向?qū)ο缶幊?/strong>亡容,是一種通過對象的方式,把現(xiàn)實世界映射到計算機模型的一種編程方法冤今。
- 面向?qū)ο蟪绦蛟O(shè)計:程序由對象來組成
- 類:構(gòu)造對象的模板或藍圖
- 對象:類的實例化
類和對象的關(guān)系好比 模具 和 具體的用模具實際做出來的東西
類和對象的關(guān)系好比 模具 和 具體的用模具實際做出來的東西
這一節(jié)里其實還提到了封裝和繼承的概念
封裝闺兢,以前的我理解為封裝就是將類里的字段對外隱藏,而其他類想要改變這些字段只能調(diào)用我的公共方法戏罢,而不可以直接修改屋谭。在讀第二遍的時候,我發(fā)現(xiàn)封裝的思想主要是為了隱藏自己內(nèi)部的實現(xiàn)(內(nèi)部實現(xiàn)不重要龟糕,重要的是對外提供的方法)桐磁,保證了獨立性。
繼承就是通過擴展一些已有的類來構(gòu)建新的類讲岁,而且新的類將會具有被擴展類的全部屬性和方法我擂,提高了重用性。
2.使用預定義類
構(gòu)造器
- 用來構(gòu)造并初始化對象的一種特殊的方法
- 構(gòu)造器的名字應該與類名相同
這里要明確一個東西缓艳,比方說校摩,我定義了一個類叫做Animal
,然后做了如下的操作
Animal mAnimal;
此時郎任,mAnimal
叫做對象變量秧耗,它是一個變量,不是一個對象
然后做如下操作
mAnimal = new Animal();
此時mAnimal
引用了一個對象
變量只能是引用對象
更改器方法和訪問器方法
- 更改器方法描述的是使用了方法之后舶治,對象的狀態(tài)會改變
- 訪問器方法描述的是使用了方法之后分井,對象的狀態(tài)沒有改變
3.用戶自定義類
隱式參數(shù)與顯示參數(shù)
一句話,隱式參數(shù)是調(diào)用方法的對象本身(在方法中可用this
來表示)霉猛,顯示參數(shù)是方法名后面的數(shù)值
Java中4種訪問修飾符
-
private
:僅對本類可見 -
public
:對外部完全可見 -
protected
:對本包及所有子類可見 -
默認(無需修飾符)
:對本包可見
4.靜態(tài)字段和靜態(tài)方法
靜態(tài)字段
靜態(tài)字段即用static
修飾的字段尺锚,靜態(tài)字段是屬于類,不屬于單個任何對象的
靜態(tài)方法
用static
修飾的方法惜浅,屬于類瘫辩,不屬于對象,即在靜態(tài)方法中不能使用this
關(guān)鍵字(即坛悉,沒有隱式參數(shù))伐厌,靜態(tài)方法不能訪問實例字段,但是可以訪問靜態(tài)字段
5.方法參數(shù)
跳過
6.對象構(gòu)造
重載
- 方法簽名:通過指定方法名和參數(shù)類型來描述一個方法
- 重載即是出現(xiàn)了多個方法裸影,有相同的名字挣轨,但是不同的參數(shù),程序會在調(diào)用方法時根據(jù)參數(shù)類型來選擇使用哪一個方法
調(diào)用構(gòu)造器后的處理的優(yōu)先級順序
- 如果第一行調(diào)用了另一個構(gòu)造器(使用
this(...)
轩猩,另外卷扮,在構(gòu)造器中調(diào)用另一個構(gòu)造器這個語句也只能寫在第一行)荡澎,則執(zhí)行另一個構(gòu)造器 - 否則則先后執(zhí)行:
- 靜態(tài)字段
- 靜態(tài)的初始化塊
- 所有實例字段初始化為默認值(0,false晤锹,null)
- 初始化塊
- 最后才是執(zhí)行構(gòu)造器主體代碼
以前總弄不清靜態(tài)字段還有靜態(tài)代碼塊的執(zhí)行順序摩幔,今天讀到這里,可謂天清地明
7.包
使用包來確保類名的唯一性
靜態(tài)導入
第 5 章 繼承
1.類鞭铆,子類或衡,超類
this
和super
的含義
-
this
- 一是指隱式參數(shù)的調(diào)用
- 二是指調(diào)用該類的其他構(gòu)造器
-
super
- 一是調(diào)用超類的方法
- 二 是調(diào)用超類的構(gòu)造器
多態(tài)
一個對象變量可以指示多種實際類型的現(xiàn)象稱為多態(tài)
替換原則:程序中出現(xiàn)超類對象的任何地方都可以使用子類對象替換。例如:可將子類對象賦給超類變量
重載解析:衔彻。薇宠。偷办。
動態(tài)綁定與靜態(tài)綁定:
- 動態(tài)綁定:在運行時能夠自動地選擇恰當?shù)姆椒ǎㄕ{(diào)用的方法依賴隱式參數(shù)的實際類型)
- 靜態(tài)綁定:用
private
艰额,static
,final
修飾的方法椒涯,編譯器將準確的知道該調(diào)用哪個方法
強制類型轉(zhuǎn)換
唯一原因:要在暫時忽視對象的實際類型之后使用對象的全部功能柄沮。
可用instanceof
操作符來判斷所屬類型
抽象類
更具有一般性的,只用作派生其他類的基類废岂,而不是用來構(gòu)造實例的類
可以包含字段和具體方法
不能被實例化
2.Object
:所有類的超類
Object
類是Java中所有類的氏族祖搓,每個類都自動的繼承自Object
類
在Java中,只有基本類型不是對象湖苞。
4.對象包裝器和自動裝箱拆箱
對象包裝器
因為基本類型不是對象拯欧,但有時候又需要把基本類型轉(zhuǎn)換成對象來使用,所以就出現(xiàn)了對象包裝器這個概念财骨。
基本類型 | 對應的包裝器類 |
---|---|
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
short |
Short |
byte |
Byte |
char |
Character |
boolean |
Boolean |
包裝器類是final
的
自動裝箱與自動拆箱
List<Integer> list = new ArrayList<>();
list.add(2);
如上面給出的例子镐作,list
添加一個元素的時候,元素類型本該是Integer
類型隆箩,可是2
只是個int
類型该贾,不過沒關(guān)系,list.add(2)
將自動的變成list.add(Integer.valueOf(2))
捌臊,這種變換稱為自動裝箱
同樣的杨蛋,如果想將一個Integer
對象賦給一個int
值時,將會自動拆箱
第 6 章 接口理澎,lambda表達式與內(nèi)部類
1.接口
在Java程序設(shè)計語言中逞力,接口不是類,而是對希望符合這個接口類的一組需求
接口中的所有方法都自動是public
方法(但是實現(xiàn)接口時糠爬,必須把方法聲明為public
)
接口中的字段總是public static final
的
接口絕不會有實例字段
接口同樣不能被實例化寇荧,但是接口變量可以引用實現(xiàn)了這個接口的類對象
一個類只能有一個超類,但可以實現(xiàn)多個接口
2.lambda
表達式
先跳過秩铆,看的云里霧里的@_@
3.內(nèi)部類
定義在另一個類中的類
原因:
- 內(nèi)部類可以對同一包中的其他類隱藏
- 內(nèi)部類方法可以訪問外部類的私有屬性
常規(guī)內(nèi)部類中可以有static
字段(但也都必須是final
)砚亭,但是不能有static
方法
局部內(nèi)部類
在一個方法中局部地定義這個類
聲明局部類時不能有訪問說明符(public
等)
對外界完全隱藏
靜態(tài)內(nèi)部類
內(nèi)部類不需要訪問外圍類對象灯变,就應該使用靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類可以有靜態(tài)字段和靜態(tài)方法
在接口中聲明的內(nèi)部類自動是static
和public
第 7 章 異常,斷言和日志
派生于Error
類或RuntimeException
類的所有異常稱為非檢查型異常
所有其他異常稱為檢查型異常
這一章的剩余部分先略過捅膘,先不看
第 8 章 泛型程序設(shè)計
泛型方法:可以在普通類型中定義添祸,也可在泛型類中定義
public class ArrayAlg {
public static <T> T getMiddle(T... a) {
return a[a.length / 2];
}
}
限定類型: 限定T
只能是限定類型的子類型
<T extends Comparable>
<T extends Comparable & Serializable> //甚至是多個限定
類型擦除:指的是定義了一個泛型類型,都會自動提供一個相應的原始類型寻仗。(原始類型用第一個限定來替換類型變量刃泌,如無限定,則替換為Object
類型)
通配符(?
):
<? extends Employee> //表示參數(shù)類型是Employee的子類
<? super Employee> //表示參數(shù)類型是Employee的超類
第 9 章 集合
集合類型 | 說明 |
---|---|
ArrayList |
可以動態(tài)增長和縮減空間的一個索引序列 |
LinkedList |
鏈表署尤,可在任何位置高效的插入和刪除的一個有序序列 |
Iterator
與Iterable
Iterator
和Iterable
都是接口
-
Iterator
:迭代器耙替,Java 1.2引入,用來代替Enumeration
的曹体,通過hasNext
和next
方法可以逐個訪問集合中的每個元素 -
Iterable
:Java 1.5 引入俗扇,為的是Implementing this interface allows an object to be the target of the "for-each loop" statement.,也就是for each
循環(huán)可以處理任何實現(xiàn)了Iterable
接口的對象
第 12 章 并發(fā)
多線程:一個程序可以同時運行多個線程
多進程和多線程的區(qū)別:每個進程都擁有自己的一整套變量箕别,而線程則共享數(shù)據(jù)
新建線程的兩種方式
一:新建類實現(xiàn)Runnable
接口(完成run
方法)铜幽,然后賦給一個Thread
對象
public static class MyRun implements Runnable {
@Override
public void run() {
System.out.println("MyRun");
}
}
// 使用
Runnable r = new MyRun();
Thread thread1 = new Thread(r);
thread1.start();
二:建立一個Thread
的子類
public static class MyThread extends Thread {
@Override
public void run() {
super.run();
System.out.println("MyThread");
}
}
// 使用
Thread thread2 = new MyThread();
thread2.start();
線程的狀態(tài)
-
New
:新建 -
Runnable
:可運行(可能正在運行也可能沒有運行) -
Blocked
:阻塞 -
Waiting
:等待 -
Timed waiting
:計時等待 -
Terminated
:終止
synchronized
關(guān)鍵字
從Java1.0版開始,Java中的每個對象都有一個內(nèi)部鎖串稀。如果一個方法聲明時有 synchronized 關(guān)鍵字除抛,那么,要調(diào)用這個方法母截,線程必須獲得內(nèi)部對象鎖
volatile
修飾符:用來修飾字段到忽,可以讓多線程安全地讀取一個字段