java自學筆記

1. java文件名和類的名字是一致 

2.java數據類型: 整數常量 小數常量 字符常量 字符串常量 布爾常量(true false 且不能用01來表示) 空常量(null)

3.方法:就是將一個功能抽取出來,把代碼單獨定義在一個大括號內,形成一個單獨的功能。

方法的調用:方法在定義完畢後,方法不會自己運行,必須被調用才能執行,我們可以在主方法main中來調用我們自己定義好的方法。在主方法中,直接寫要調用的方法名字就可以調用了。

方法定義注意事項:
方法必須定義在一類中方法外
方法不能定義在另一個方法的裏面

4.流程控制語句:

if else ;switch ;for循環;while循環; do while循環;跳出語句break,continue;都與c++用法相同。

5.一個標準的類通常需要擁有下面四個組成部分
1.所有的成員變量都要使用private關鍵字修飾
2.爲每一個成員變量編寫一對兒Getter/Setter方法
3.編寫一個無參數的構造方法
4.編寫一個全參數的構造方法

public class Person {
    private String name;//只有兩行是生成的 其他的都是通過alt +ins 自動生成的
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

6.java的兩個變量或者方法之間的複製,都是傳遞地址,類似於c++中的引用傳遞。在java中沒有值傳遞。

7.數組有一個缺點:一旦創建,程序運行期間長度不可以改變。

8.ArrayList類。


數組的長度不可以發生改變,但是ArrayList集合的長度是可以隨意改改變的
對於ArrayList集合來說,有一個尖括號<E>代表泛型
泛型:也就是裝在集合當中的所有元素,全都是統一的類型
注意:泛型只能是引用類型,不能是基本類型
Arraylist當中的常用方法有(最好背住,其他的可以查閱手冊):
public boolean add(E e);向集合當中添加元素,參數的類型和泛型一致
備註;對於ArrayList集合來說,add添加動作一定是成功的,所以返回值可用可不用
但是對於其他的集合來說,add添加動作不一定成功。
public E get(int index);從集合當中獲取元素,參數是索引編號,返回值就是對應位置的元素。
public E remove(int index);從集合當中刪除元素,參數是索引編號,返回值就是被刪除掉的元素。
public int size();獲取集合的尺寸長度,返回值是集合中包含的元素個數。
如果希望向集合Arraylist當中存儲基本數據類型,必須使用基本類型對應的“包裝類”
基本類型  包裝類(引用類型,包裝類都位於java.lang包下)
byte       Byte
short      Short
int        Integer
long       Long
float      Float
double     Double
char       Character
boolean    Boolean

9.String 類

java程序中的所有字符串字面值(如“abc”)都作爲此類的實例實現,
就是說,程序當中所有的雙引號字符串,都是String類的對象。(就算沒有new,也照樣是)

創建字符串的常見3+1種方法
三種構造方法:
public String():創建一個空白字符串,不含有任何內容
public String(char[] array): 根據字符數組的內容,來創建對應的字符串
public String(byte[] array): 根據字節數組的內容,來創建對應的字符串
一種直接創建方法
String str="Hello"
字符串常量池:程序當中直接寫上的雙引號字符串,就在字符串常量池中
對於基本類型來說,==是進行數值的比較
對於引用類型來說,==就是地址值的比較
==是進行對象的地址值比較,如果確實需要字符串內容的比較,可使用兩個方法
public boolean equals(object obj);參數可以是任何對象,只有參數是一個字符串並且內容相同的纔會給true,否則返回false
備註;
1.任何對象都能用object進行接收
2.equals方法具有對稱性,也就是a.equals(b)何b.equals(a)效果一樣。
3.如果雙方一個常量一個變量,推薦把常量字符串寫在前面
publuic boolean equalsIgnoreCase(String str)  忽略大小寫,進行內容比較
String int length();獲取字符串當中含有的字符個數 拿到字符串長度
public String concat(String str) 將當前字符串和參數字符串拼接常返回值新的字符串
public char charAt(int index) 獲取指定索引位置的單個字符(索引從0開始)
public int indexof(String str) 查找參數字符串在本字符串當中首次出現的索引位置 如果沒有返回-1值
字符串的截取方法
public String substring(int index);截取從參數位置一直到字符串末尾,返回新字符串
public String substring(int begin,int end);截取從begin開始,一直到end結束,中間的字符串
備註:[begin,end) 包含左邊 不包含右邊
String當中與轉換相關的方法有:
public char[] toCharArray();將當前字符串拆分爲字符數組作爲返回值
public byte[] getBytes();獲得當前字符串底層的字節數組
public String replace(CharSequence oldString,CharSequence newString)
將所有出現的老字符串替換成爲新的字符串,返回替換之後的結果新字符串,CharSequence意思就是說可以接受字符串類型
分割字符串的方法:
public String[] split(String regex);按照參數的規則,將字符串切分成若干部分
注意事項: spilt方法的參數其實是一個"正則表達式",如果按照英文句點"."進行切分,必須寫"\\."

10.static關鍵字

關於 static  關鍵字的使用,它可以用來修飾的成員變量和成員方法,被修飾的成員是屬於類的,而不是單單是屬
於某個對象的。也就是說,既然屬於類,就可以不靠創建對象來調用了。反過來說,如果沒加static,則該成員變量或者成員方法必須首先創建對象,然後通過對象才能使用它。

對於靜態方法來說,可以通過對象名來調用(不推薦),也可以通過類名來調用。

類名稱.靜態變量  類名稱.靜態方法    對於本類當中的靜態方法,可省略類名稱 直接使用方法名進行調用

靜態方法不能直接訪問非靜態的變量和方法,因爲在內存中是先有的靜態內容,後有的非靜態內容。

靜態方法當中不能使用this  原因是this 代表當前對象,通過誰調用的方法,誰就是對象。但靜態不通過對象來調用。

靜態代碼塊: 特點是: 當第一次用到本類時,靜態代碼塊執行唯一的一次。靜態內容總是優先於非靜態,所以靜態代碼比構造方法先執行。 靜態代碼塊的典型用途: 用來一次性的對靜態成員變量進行賦值。

11.數組工具類 Arrays

java.util.Arrays  此類包含用來操作數組的各種方法,比如排序和搜索等。其所有方法均爲靜態方法。

public static String toString(int[] a)  :返回指定數組內容的字符串表示形式

public static void sort(int[] a)  :對指定的 int 型數組按數字升序進行排序

備註:如果是數值 sort默認按數值大小升序排列。如果是字符串,sort默認按照字母升序。如果是自定義類型,則需要該自定義的類有相應的接口的支持。

 

12.數學工具類 Math類

java.lang.Math  類包含用於執行基本數學運算的方法,如初等指數、對數、平方根和三角函數。類似這樣的工具
類,其所有方法均爲靜態方法,並且不會創建對象,調用起來非常簡單。

public static double abs(double a)  :返回 double 值的絕對值。

public static double ceil(double a)  :返回大於等於參數的最小的整數。

public static double floor(double a)  :返回小於等於參數最大的整數

public static long round(double a)  :返回最接近參數的 long。(相當於四捨五入方法)

13.繼承

通過 extends  關鍵字,可以聲明一個子類繼承另外一個父類,定義格式如下:

class 子類 extends 父類 {
……
}

區分子類中三種重名變量的方法:

局部變量: 直接寫成員變量名

本類的成員變量:this.成員變量名

子類的成員變量:super.成員變量名

 

在父子類的繼承關係中,創建子類對象,訪問成員方法的規則:創建的對象是誰,就優先用誰,如果沒有則向上找。

注意事項:無論是成員方法還是成員變量,如果沒有都是向上找父類,絕對不對向下找子類的。

方法覆蓋重寫的注意事項:

1.必須保證父子類之間的方法的名稱相同,參數列表也相同

@override寫在方法前面,用來檢測是不是有效的正確覆蓋重寫,這個註解就算不寫,只要滿足要求,也是爭取的覆蓋重寫

2.子類方法的返回值必須小於等於父類方法的返回值類型

擴展提示:java.lang.object類是所有類的公共最高父類,java.lang.String就是object的子類

3.子類方法的權限必須大於等於父類方法的權限修飾符

擴展提示:public>protect>(default即留空)>private

 

繼承關係中,父子類構造方法的訪問特點:

1.子類構造方法當中有一個默認隱含的“super()”調用,所以一定是先調用的父類構造,後執行的子類構造。

2.子類構造可以通過super關鍵字來調用父類重載構造

3.super的父類構造調用,必須是子類構造方法的第一個語句,不能一個子類構造調用多次super構造。

總結:子類必須調用父類構造方法,不寫則贈送super(); 寫了則用寫的指定的super調用,super只能有一個,還必須是第一個。

super關鍵字的用法有三種:

1.在子類的成員方法中,訪問父類的成員變量

2.在子類的成員方法中,訪問父類的成員方法

3.在子類的構造方法中,訪問父類的構造方法。

super用來訪問父類內容,而this用來訪問本類內容,用法也有三種:

1.在本類的成員方法中,訪問本類的成員變量

2.在本類的成員方法中,訪問本類的另一個成員方法

3.在本類的構造方法中,訪問本類的另一個構造方法

注意:this和super兩中構造調用,不能同時使用

14.抽象類

父類中的方法,被它的子類們重寫,子類各自的實現都不盡相同。那麼父類的方法聲明和方法主體,只有聲明還有
意義,而方法主體則沒有存在的意義了。我們把沒有方法主體的方法稱爲抽象方法。Java語法規定,包含抽象方法
的類就是抽象類。

抽象方法 : 沒有方法體的方法。 格式:修飾符 abstract 返回值類型 方法名 (參數列表);
抽象類:包含抽象方法的類。 如果一個類包含抽象方法,那麼該類必須是抽象類。

注意事項:1.抽象類不能創建對象,如果創建,編譯無法通過而報錯。只能創建其非抽象子類的對象。

 2.抽象類中,可以有構造方法,是供子類創建對象時,初始化父類成員使用的。

3.抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

15.接口

接口,是Java語言中一種引用類型,是方法的集合,如果說類的內部封裝了成員變量、構造方法和成員方法,那麼
接口的內部主要就是封裝了方法。接口的定義,它與定義類方式相似,但是使用 interface  關鍵字。它也會被編譯成.class文件,但一定要明確它並不是類,而是另外一種引用數據類型。

類與接口的關係爲實現關係,即類實現接口,該類可以稱爲接口的實現類,也可以稱爲接口的子類。實現的動作類
似繼承,格式相仿,只是關鍵字不同,實現使用 implements 關鍵字

在java9+版本中,接口的內容可以有:

1.成員變量 其實是常量 格式如下

【public】【static】【final】數據類型 常量名稱=數據值

注意:常量必須進行賦值,而且一旦賦值不能改變。常量名稱完全大寫,用下劃線進行分隔

2.接口中最重要的就是抽象方法:格式如下

【public】【abstract】返回值類型 方法名稱(參數列表);

注意:實現類必須覆蓋重寫接口所有的抽象方法,除非實現類是抽象類

3.從java8開始,接口裏允許定義默認方法,格式如下

【public】default 返回值類型 方法名稱(參數列表){方法體}

注意:默認方法也可以被覆蓋重寫

4.從java8開始 接口裏允許定義靜態方法,格式如下:

【public】static 返回值類型 方法名稱(參數列表){方法體}

注意:應該通過接口名稱進行調用,不能通過實現類對象調用靜態接口方法

5.從java9開始,接口裏允許定義私有方法 格式如下

普通私有方法: private 返回值類型 方法名稱(參數列表){方法體}

靜態私有方法: private static 返回值類型 方法名稱(參數列表){方法體}

注意:privatefe的方法只有接口自己才能調用,不能被實現類或別人使用。

 

使用接口的注意事項有:

1.接口是沒有靜態代碼塊或者構造方法的

2.一個類的直接父類是唯一的,但是一個類可以實現多個接口

3.如果實現類所實現的多個接口當中,存在重複的抽象方法,那麼只需要覆蓋重寫一次即可。

4.如果實現類沒有覆蓋重寫所有接口當中的所有抽象方法,那麼實現類就必須是一個抽象類

5.如果實現類所實現的多個接口當中,存在重複的默認方法,那麼實現類一定要對衝突的默認方法進行覆蓋重寫

6.一個類如果直接父類當中的方法,和接口當中的默認方法產生了衝突,優先使用父類當中的方法。可以用覆蓋重寫。

類於接口之間的關係

1.類於類之間是單繼承的。直接父類只有一個

2.類於接口之間是多實現的。一個類可以實現多個接口

3.接口與接口之間是多繼承的。就是說接口也可以繼承多個接口。

注意事項:

1.多個父接口當中的抽象方法如果重複,沒關係

2.多個父接口當中的默認方法如果重複,那麼子接口必須進行默認方法的覆蓋重寫(而且帶着default關鍵字)

16.多態

多態體現的格式:

父類類型 變量名 = new 子類對象;
變量名.方法名();

父類類型:指子類對象繼承的父類類型,或者實現的父接口類型。

17.Map集合

Map集合的特點:

1.Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)

2.Map集合中的元素,key和value的數據類型可以相同,也可以不同

3.Map集合中的元素,key是不允許重複的,value是可以重複的

4.Map集合中的元素,key和value是一一對應的

java.util.HashMap<k,v> 集合 implements Map<k,v>接口

HashMap集合的特點:

1.HashMap集合底層是哈希表,查詢的速度特別快

2.HashMap集合是一個無序的集合,存儲元素和取出元素的是順序可能不一致。

java.util.LinkedHashMap<k,v>集合 extends  HashMap<k,v>集合

LinkedHashMap集合的特點:

HashMap集合是一個有序的集合,存儲元素和取出元素的是順序是一致的。

 

18.Hashtable集合

Hashtable:底層也是一個哈希表,是一個線程安全的集合,是單線程集合,速度慢

HashMap:底層是一個哈希表,是一個線程不安全的集合,是多線程的集合,速度快

HashMap集合(包括之前所學的所有集合):可以存儲null值,null鍵

Hashtable集合:不能存儲null值,null鍵

Hashtable和Vector集合一樣。在jdk1.2版本之後被更先進的集合(HashMap,ArrayList)取代了.但Hashtable的子類Properties依然活躍在歷史舞臺。Properties集合是一個唯一與IO流相結合的集合

 

19.線程

單線程的缺點:出現異常後,程序立即停止。影響後面代碼的運行。

創建多線程方法一步驟:
    1.創建一個Thread類的子類
    2.在Thread類的子類中重寫Thread類中的run方法,設置線程任務(開啓線程要做什麼)
    3.創建Thread類的子類對象
    4.調用Thread類中的start方法,開啓新的線程,執行run方法
    void start() 使該線程開始執行;java虛擬機使用該線程的run方法。
    多次啓動一個線程是非法的,特別是當線程已經結束執行後,不能再重新啓動。
    java程序屬於搶佔式調度,哪個線程的優先級高,哪個線程優先執行;同一個優先級,隨機選擇一個執行

創建多線程程序的第二種方式:實現Runnable接口
java.lang.Runnable
Runnable接口應該由那些打算通過某一線程執行其實例的類實現。類必須定義一個稱爲run的無參方法

實現步驟:
1.創建一個Runnable接口的實現類
2.在實現類中重寫Runable接口的run方法,設置線程任務
3.創建一個Runnable接口的實現類對象
4.創建Thread類對象,構造方法中傳遞Runnable接口的實現類對象
5.調用Thread類中的start方法,開啓新的線程執行run方法
獲取線程的方法:
1.使用Thread類中的方法getName()
    String name=getName()  再sout name返回該線程的名稱
 2.可以先獲取到當前正在執行的線程,使用線程中的方法getName()獲取線程的名稱 Thread t=Thread.currentThread();再sout t返回線程名稱

 

線程的名稱:

主線程:main

新線程:Threa-0,Thread-1,Thread-2

20.線程安全問題

當我們使用多個線程訪問同一資源的時候,且多個線程中對資源有寫的操作,就容易出現線程安全問題。
要解決上述多線程併發訪問一個資源的安全性問題:也就是解決重複票與不存在票問題,Java中提供了同步機制
(synchronized)來解決。

有三種方法可以操作

1. 同步代碼塊。
2. 同步方法。
3. 鎖機制。

/*解決線程安全問題的一種方案:使用同步代碼塊
格式:
synchronized(鎖對象){
    可能會出現線程安全問題的代碼(訪問了共享數據的代碼)
}
注意:
1.通過代碼塊中的鎖對象,可以使用任意的對象
2.但是必須保證多個線程使用的鎖對象是同一個
3.鎖對象作用:
    把同步代碼塊鎖住,只讓一個線程在同步代碼塊中執行
* */

21 .

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章