記錄一個學渣從新開始學習java的筆記(不定時更新)
由於自己有一定的學習基礎,所以筆記不會太過詳細,主要記錄自己容易忘記的知識點以及難點,這裡用的編輯器是IDEA。
面向物件的三大特徵
-
封裝:是面向物件程式語言對客觀事物的模擬,客觀事物裡成員變數都是隱藏在物件內部的,外界是無法直接操作的。
封裝原則:將類的某些資訊隱藏在類的內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問成員變數private,提供對應的getXxx()/setXxx()方法。
好處:通過方法來控制成員變數的操作,提高了程式碼的安全性,把程式碼用方法進行封裝,提高了程式碼的複用性。
-
繼承:是面向物件三大特徵之一,可以使得子類具有父類的屬性和方法,還可以在子類中重新定義,追加屬性和方法。(父類也被稱為基類,超類。子類也被稱為派生類)
public class 子類名 extends 父類名{}
好處:提高了程式碼的複用性
提高了程式碼的維護性
弊端:繼承讓類與類之間產生了關係,類的耦合性增強了,當父類發生變化時子類實現也不得不跟著變化,削弱了子類的獨立性。
注意事項:java中類只支援單繼承,不支援多繼承
java中類支援多層繼承
注:
-
變數名相同時,訪問的是子類變數,可用關鍵字 super.變數名 訪問父類中的名字相同的變數
-
子類中所有的構造方法預設都會訪問父類中無參的構造方法。(因為子類會繼承父類中的資料,可能還會使用父類的資料,所以子類初始化之前,一定要完成父類的初始化,另外每一個子類構造方法的第一條語句預設都是:super())
-
註釋
書寫註釋是一個非常好的習慣,註釋是不會被執行的,java中註釋有三種。
-
單行註釋 即註釋一行,例:
//單行註釋
System.out.println("Hello World");//單行註釋 -
多行註釋
/*
多行
註釋
*/ -
文件註釋
/*
*瞭解即可
* */
識別符號
關鍵字
private
private是一個許可權修飾符,可以修飾成員(成員變數和成員方法)
作用是保護成員不被別的類使用,被private修飾的成員只在本類中才能訪問
對於private修飾的成員變數,如果需要被其他類使用需提供相應的操作如:
-
提供“get變數名()”方法,用於獲取成員變數的值,方法用public修飾。
-
提供“set變數名(引數)”方法,用於設定成員變數的值,方法用public修飾。
this
this修飾的變數用於指代成員變數,方法的形參如果與成員變數同名,不帶this修飾的變數指的是形參,而不是成員變數。
方法的形參沒有與成員變數同名,可以不用this修飾。
注:方法被哪個物件呼叫,this就代表哪個物件。
修飾符
狀態修飾符
-
final (最終態)可以修飾成員變數,成員方法,類
特點:
修飾方法:表明該方法是最終方法,不能被重寫
修飾變數:表明該變數是常量,不能再次被賦值
修飾類:表明該類是最終類,不能被繼承
final修飾區域性變數
(1)邊量是基本型別:final修飾指的是基本型別的資料值不能發生改變
(2)變數是引用型別:final修飾指的是引用型別的地址值不能發生改變,但是地址裡面的內容是可以發生改變的
-
static(靜態)可以修飾成員方法,成員變數
-
特點
被類的所有物件共享
可以通過類名呼叫,也可以通過物件名呼叫,推薦使用類名呼叫
靜態成員方法只能訪問靜態成員
資料型別
浮點數(double,float)不能表示精確的數值,不能用於比較和表示貨幣等,最好完全避免浮點數進行比較;
轉義字元:
強制轉換,自動轉換
注意溢位,精度問題,不能把物件型別轉換為不相干的型別。
變數
資料型別 變數名[=範圍];
[]裡面的內容可以不寫,則數值變數預設賦值為0,字元型別預設初始值為null,boolean預設是false,除了基本變數預設初始值均為null。
每個變數都有型別,型別可以是基本型別,也可以是引用型別。
變數名必須是合法的識別符號。
變數宣告是一條完整的語句,所以必須以分號結尾。
注意作用域:例項變數(全域性變數),區域性變數必須賦初始值,類變數(靜態變數static)。
成員變數:類中方法外定義的變數
區域性變數:方法內定義的變數
區別:
-
成員變數在堆記憶體中,區域性變數在棧記憶體中
-
成員變數隨著物件的存在而存在,隨著物件的消失而消失,區域性變數隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失。
-
成員變數有預設的初始化值,區域性變數沒有預設的初始化值,必須先定義,賦值,才能使用。
常量
一旦定義後,就不會改動的值。
final 常量名=值;
常量名一般使用大寫字元。
變數命名規範
所有變數,方法,類名:要求見名知意。
類成員變數:首字母小寫,駝峰原則即除了第一個單詞以外,後面的單詞首字母均大寫。lastName。
區域性變數:首字母小寫和駝峰原則。
常量:大寫字母和下劃線,MAX_VALUE
類名:首字母大寫,駝峰原則,Man,GoodMan
方法名:首字母小寫和駝峰原則。
運算子
包機制
用於區別類名的名稱空間。(可以理解為資料夾)
作用:對類進行分類管理
語法:package pkg1[.pkg2[.pkg3...]];該語句必須放在最開頭。
一般利用公司域名倒置作為包名。
在java程式中匯入某包。使用“import”語句。
import package1[.package2...].(classname|*);
注:修飾符不存在先後順序。
javaDoc
javaDoc命令是用來生成自己的API文件的
引數資訊
-
@author 作者名
-
@version 版本號
-
@since 指明需要最低JDK版本
-
@param 引數名
-
@return 返回值
-
@throws 丟擲的異常情況
例:
/**
* @author 小朋友
* @since 1.8
*/
public class ForExample {
public static void main(String[] args) {
int a=0;
}
/**
*
* @param name
* @return
* @throws Exception
*/
public String writer(String name)throws Exception
{
return name;
}
}
可以生成幫助文件
步驟
-
開啟命令列視窗
-
進入所需生成文件的路徑
-
輸入 javadoc -encoding UTF-8 -charset UTF-8 所有生成幫助文件的檔名加字尾
-
回車
scanner物件
可通過Scanner類來獲取使用者的輸入
基本語法 Scanner s =new Scanner(System.in);
通過Scanner類的next()和nextLine()方法獲取輸入的字串,用hasNext()與hasNextLine()方法判斷是否還有輸入的資料
例:
public class demo_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用next和nextLine方法接收:");
// if(scanner.hasNext())//判斷是否有字串輸入
// {
// String str=scanner.next();//只能接收單個字串
// System.out.println("接收到字串:"+str);
// }
if(scanner.hasNextLine())
{
String str=scanner.nextLine();//可以接收一行字串
System.out.println("接收到字串:"+str);//輸出
}
}
}
結構
-
順序結構
-
選擇結構 if-else switch 語句
case穿透:case語句後面如果不加breakj結束迴圈將繼續執行下一個case(不會再進行判斷)後面的語句,直到遇到break或者語句最後才結束。
-
迴圈結構 while迴圈, for迴圈,do—while迴圈,continue結束本次迴圈,break結束迴圈,巢狀迴圈。
javaAPI
指的是JDK中提供的各種功能的java類,這些類將底層的實現封裝了起來,我們不需要關心這些類是如何實現的,只需要學習這些類如何使用即可。可以通過幫助文件來學習這些API如何使用。
String類
String類在java.lang包下,所以使用的時候不需要導包。
String類代表字串。 Java程式中的所有字串文字(例如"abc" )都被實現為此類的例項。也就是說java程式中所有的雙引號字串,都是String類的物件。
特點
字串不變; 它們的值在建立後不能被更改。 字串緩衝區支援可變字串。
String物件是不可變的,但是它們可以被共享。
字串效果上相當於字元陣列(char[]),但是底層原理是位元組陣列(byte[])
通過new建立的字串物件,每次new都會申請一個記憶體空間,即使內容相同,但是地址值不同。
以“”方式給出的字串,只要字串序列相同(順序和大小寫),無論在程式程式碼中出現幾次,JVM都只會建立一個String物件,並在字串池中維護。
有關方法
-
a.equals(b) 比較字串a和b的內容是否相等 返回值為boolean型別
-
a.length() 返回字串a的字元長度 返回值為int型別
-
a.charAt(int i) 獲取指定位置上的char值 返回值為char型別
StringBuilder
StringBuilder是一個可變的字串類,可以把它看成是一個容器,這裡的可變指的是StringBuilder物件中的內容是可變的。
StringBuilder append(任意型別) 新增資料,並返回物件本身
StringBuilder reverse() 返回相反的字元序列
這兩個方法String是沒有的,所以出現了二者的相互轉換
StringBuilder轉換為String
String toString() 通過toString()就可以實現把StringBuilder轉換為String
String轉換為StringBuilder
StringBuilder(String s) 通過構造方法就可以實現把String轉換為StringBuilder類。
Random類
簡單來說就是產生隨機數的一個類
-
導包 import java.util.Random
-
Random r=new Random();
-
int i=r.nextInt(10);//獲取[0,10)的整數。
java中的記憶體分配
棧記憶體
儲存區域性變數
定義在方法中的變數,使用完畢後立即消失。
堆記憶體
儲存new出來的內容(實體,物件)陣列在初始化時,會為儲存空間新增預設值。
每一個new出來的東西都有一個地址值,使用完畢,會在垃圾回收器空閒時被回收。
陣列
陣列動態初始化 例:int []arr=new int[3];
陣列靜態初始化 例: int []arr={1,2,3};
常見小問題
-
索引越界
訪問了陣列中不存在的索引對應的元素,造成索引越界問題。
-
空指標異常
訪問的陣列已經不再指向堆記憶體的資料,造成空指標異常。
集合
集合是提供一種儲存空間可變的儲存模型,儲存的資料容量可以發生改變。集合類有很多,先學習第一個:ArrayList
ArrayList<E> 可調整大小的陣列實現,<E>是一種特殊的資料型別,泛型。
在出現E的地方我們使用引用資料型別替換即可。
ArrayList部分方法
-
ArrayList() 建立一個空的集合物件
-
boolean add(E e) 將指定的元素追加到此集合的末尾
-
void add(int index,E element) 在此集合中指定位置插入指定的元素
-
boolean remove(Object o) 刪除指定的元素,返回刪除是否成功
-
E remove(int index) 刪除指定索引處的元素,返回被刪除的元素。
-
E set(int index,E element) 修改指定索引處的元素,返回被修改的元素
-
E get(int index) 返回指定索引處的元素
-
int size() 返回集合中的元素的個數
方法
定義
具有獨立功能的程式碼塊組織成為一個整體,使其具有特殊功能的程式碼集。
注意
-
方法必須先建立才可以使用該過程稱為方法定義。
-
方法建立後並不是直接執行的,需要手動建立使用後才執行,該過程稱為方法呼叫。
-
帶返回值定義的方法return後面的返回值與方法定義上的資料型別要匹配。
-
方法的返回值通常會使用變數接收,否則該返回值將無意義。
-
方法不能巢狀定義
-
void表示無返回值,可以省略return,也可以寫reruen;
-
方法引數傳遞 對於基本型別的引數,形式引數的改變,不影響實際引數的值,但是對於引用型別的引數,形式引數的改變,影響實際引數的值。(基本型別傳遞的值,引用型別傳遞的是地址)
帶引數方法定義
public static void 方法名(資料型別 變數名1,資料型別 變數名1...){方法體}
方法呼叫時,引數的數量與型別必須與方法定義中的設定相匹配。
形參和實參
形參:方法定義中的引數等同於變數定義格式例如:int number
實參: 方法呼叫中的引數,等同於使用變數或者常量。例如:10,number
方法過載
方法過載指的是同一個類中定義的多個方法之間的關係,滿足下列條件的多個方法相互構成過載。
-
多個方法在同一個類中
-
多個方法具有相同的方法名、
-
多個方法的引數不相同,型別不同或者數量不同
不能通過返回值來判斷兩個方法是否相互構成過載。
方法重寫
概述:子類中出現了和父類中一樣的方法宣告
應用:當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容 注意事項:1. 私有方法不能被重寫(父類私有成員子類是不能繼承的)
-
子類方法訪問許可權不能更低(public>預設>私有)
構造方法
是一種特殊的方法主要是完成物件資料的初始化。
如果沒有定義構造方法,系統將給出一個預設的無參構造方法
如果定義了構造方法,系統將不再提供預設的構造方法,若已經定義了帶參構造方法,還要使用無參構造方法。就必須再寫一個無參構造方法。
注:構造方法無返回值 例:public 類名(){}
Debug
概述:
Debug是供程式設計師使用的程式除錯工具,它可以用於檢視程式的執行流程,也可以用於追蹤程式執行過程來除錯程式。
-
加斷點:選擇要設定斷點的程式碼行,在行號的區域後面單擊滑鼠左鍵即可。
-
執行斷點:在程式碼區域右鍵,點選Debug執行。
-
觀察Debugger視窗以及Console視窗。
-
點Step Into或者快捷鍵F7執行下一步
-
結束:點選視窗的Stop結束
-
刪除斷點:選擇要刪除的斷點,單擊滑鼠左鍵即可。
注意事項:如果資料來自於鍵盤輸入,一定要記住輸入資料,否則就不能繼續執行。
類
類是對現實生活中一類具有共同屬性和行為的事務的抽象,確定物件將會擁有的屬性和行為。類是java程式的基本組成單位。
類的組成
-
屬性:在類中通過成員變數來體現(類中方法外的變數)
-
行為:在類中通過成員方法來體現
特點
類是物件的資料型別
類是具有相同屬性和行為的一組物件的集合
物件:是能夠看得到摸得著的真實存在的實體
類是物件的抽象
物件是類的實體
物件的行為:物件能夠執行的操作
注:一個類的多個物件的成員變數是不同的,但可以共用方法。
抽象類
在java中,一個沒有方法體的方法應該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類
多型
概述:同一個物件在不同時刻表現出來的不同形態
多型的前提和體現
-
有繼承/實現關係
-
有方法重寫
-
有父類引用指向子類物件
多型中成員訪問特點
-
成員變數:編譯看左面,執行看左邊
-
成員方法:編譯看左面,執行看右邊
(因為成員方法有重寫,而成員變數沒有)
好處和弊端
-
好處:提高了程式的擴充套件性(具體體現:定義方法的時候,使用父型別作為引數,將來在使用的時候使用具體的子型別參與操作)
-
弊端:不能使用子類的特有功能
-
轉型
-
向上轉型
從子到父 父類引用指向子類物件 (例: fu f=new zi())
-
向下轉型
從父到子 父類引用轉為子類物件(例: zi z=(zi)f)
-
雜
使用==做比較
對於基本型別:比較的是資料值是否相同。
對於引用型別:比較的是地址值是否相同。