《Java核心技術(shù)I》筆記

日期 說明
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)系好比 模具 和 具體的用模具實際做出來的東西

這一節(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)先級順序

  1. 如果第一行調(diào)用了另一個構(gòu)造器(使用this(...)轩猩,另外卷扮,在構(gòu)造器中調(diào)用另一個構(gòu)造器這個語句也只能寫在第一行)荡澎,則執(zhí)行另一個構(gòu)造器
  2. 否則則先后執(zhí)行:
    1. 靜態(tài)字段
    2. 靜態(tài)的初始化塊
    3. 所有實例字段初始化為默認值(0,false晤锹,null)
    4. 初始化塊
  3. 最后才是執(zhí)行構(gòu)造器主體代碼

以前總弄不清靜態(tài)字段還有靜態(tài)代碼塊的執(zhí)行順序摩幔,今天讀到這里,可謂天清地明

7.包

使用包來確保類名的唯一性

靜態(tài)導入

第 5 章 繼承

1.類鞭铆,子類或衡,超類

thissuper的含義

  • 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艰额,staticfinal修飾的方法椒涯,編譯器將準確的知道該調(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)部類自動是staticpublic

第 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 鏈表署尤,可在任何位置高效的插入和刪除的一個有序序列

IteratorIterable

IteratorIterable都是接口

  • Iterator:迭代器耙替,Java 1.2引入,用來代替Enumeration的曹体,通過hasNextnext方法可以逐個訪問集合中的每個元素
  • 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修飾符:用來修飾字段到忽,可以讓多線程安全地讀取一個字段

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市清寇,隨后出現(xiàn)的幾起案子喘漏,更是在濱河造成了極大的恐慌,老刑警劉巖颗管,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陷遮,死亡現(xiàn)場離奇詭異,居然都是意外死亡垦江,警方通過查閱死者的電腦和手機帽馋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來比吭,“玉大人绽族,你說我怎么就攤上這事●锰伲” “怎么了吧慢?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赏表。 經(jīng)常有香客問我检诗,道長匈仗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任逢慌,我火速辦了婚禮悠轩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攻泼。我一直安慰自己火架,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布忙菠。 她就那樣靜靜地躺著何鸡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牛欢。 梳的紋絲不亂的頭發(fā)上骡男,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音氢惋,去河邊找鬼洞翩。 笑死稽犁,一個胖子當著我的面吹牛焰望,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播已亥,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼熊赖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虑椎?” 一聲冷哼從身側(cè)響起震鹉,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捆姜,沒想到半個月后传趾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡泥技,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年浆兰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珊豹。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡簸呈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出店茶,到底是詐尸還是另有隱情蜕便,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布贩幻,位于F島的核電站轿腺,受9級特大地震影響两嘴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜族壳,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一溶诞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧决侈,春花似錦螺垢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庐冯,卻和暖如春孽亲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背展父。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工返劲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栖茉。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓篮绿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吕漂。 傳聞我的和親對象是個殘疾皇子亲配,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容