title: Java學(xué)習(xí)筆記
date: 2018-05-18 12:00:00
tags:
- Java
- 學(xué)習(xí)筆記
Perface
因為 Minecraft 接觸到 Java欢唾,很想寫 Minecraft 的插件/MOD油昂,可惜今年寒假才算開始入門串塑,到了現(xiàn)在大一下學(xué)期(18 年 5 月)斷斷續(xù)續(xù)地學(xué),沒有具體的學(xué)習(xí)安排所以沒堅持下來靖苇,最近看了這篇文章Java 心得感覺又活過來了阱州,就開始在這里更新學(xué)習(xí)日記吧做一個長久一點的規(guī)劃,比如大二上學(xué)期要學(xué)會什么勋拟,下學(xué)期要學(xué)會什么
Day 1(#0518)
20180518
重讀《Java 從入門到精通》勋磕,14 年購入,此書較實用
不適合深入學(xué)習(xí)
因為上學(xué)期有 C 基礎(chǔ)敢靡,快速略讀了 1-4 章挂滓,漏讀位操作符
,需要時再補
晚上在知乎搜Java 項目
時看到這篇文章Java 心得
這不就是我想成為的那種人嗎
每天 10 小時寫代碼...利用好時間
未接觸但較為重要的數(shù)據(jù)結(jié)構(gòu)
算法
數(shù)據(jù)庫
接下來試著做個項目吧啸胧,雖然 API 都沒怎么看過
啃書吧赶站,不懂就看視頻,可以去下個離線視頻看
Day 2(#0519 8hrs)
通讀第 5 章字符串 String
與第 6 章數(shù)組 Arrays
纺念,早上 6 點尿憋醒又睡到 9 點...12 點出發(fā)贝椿,自習(xí)室 8 小時今天睡得比較多,白天都在學(xué)也不太困陷谱,大概就是晚起的好處...
昨天看了那篇文章后就打算啃書了团秽,也可以堅持下來,看不懂的再去看視頻吧~
第 5 章 字符串 String
主要講了 String 字符串類的使用(java.lang
包)
聲明創(chuàng)建,連接字符串
String str = "Hello"; 聲明創(chuàng)建
String s = str + " " + str; 連接
獲取字符串信息
str.length(); 獲取字符串長度
int size = str.indexOf("a"); 查找字符串索引位置
str.charAt(index); 獲取字符串索引位置的字符
字符串操作
字符串截取 | 去空格 | 替換 | 判斷開頭結(jié)尾 | 判斷相等 | 比較 Unicode 順序 | 轉(zhuǎn)換大小寫 | 分割
str.substring(0,3); 截取字符串
str.trim(); 去除字符串空格
str.replace("a","B"); 字符串替換
str.startsWith(" "); 判斷是否字符串的開頭/* boolean */
str.endsWith(" "); 判斷是否字符串的結(jié)尾
str.equals(str2); 判斷字符串是否相等
str.compareTo(str2); 比較Unicode值順序
str.toLowerCase(); 轉(zhuǎn)換為小寫字符串
str.toUpperCase(); 轉(zhuǎn)換為大寫字符串
str.split(","); 分割字符串
格式化字符串
str.format();
日期時間格式化
import java.util.Date;
Date date = new Date();
String s = String.format("%tc",date); 參考日期|時間|組合|常規(guī)轉(zhuǎn)換符表!
使用正則表達式判斷格式正誤
String RegEx = "\\p......"
if (str.matches(RegEx))
參考正則表達式寫法
字符串生成器
通過 StringBuilder 類快速生成字符串叭首,省時間高效率
StringBuilder builder = new StringBuilder();
append(); insert(); delete(); 追加|插入|刪除
小結(jié)
字符串的創(chuàng)建 | 連接方式 | 獲取字符串信息 | 常用字符串操作格式化字符串 | 使用正則表達式 | 字符串生成器
第 6 章 數(shù)組 Arrays
數(shù)組創(chuàng)建及聲明
數(shù)組是具有相同數(shù)據(jù)類型的一組數(shù)據(jù)的集合創(chuàng)建及聲明 | 遍歷數(shù)組 | Arrays 類的使用(填充|排序|復(fù)制|查詢)
數(shù)組排序算法明天看:p
int[] arr = new int[5];
int[] arr = {1,2,3,4,5};
int[][] arr2 = {{1,2},{5,6}};
遍歷數(shù)組
Arrays 類的使用
Arrays.fill(arr,8); 填充
Arrays.sort(arr); 排序
Arrays.copyOf(arr,5); 復(fù)制
int index = Arrays.binarySearch(arr,0,1,8); 數(shù)組查詢
明天看數(shù)組排序算法
和第7章面向?qū)ο?/code>
Day 3 (#0520)
通讀了數(shù)組排序算法
习勤,理解的算不上深刻
學(xué)習(xí)算法應(yīng)該多讀幾遍代碼再嘗試自己寫
數(shù)組|數(shù)組排序算法 (P114~P120)
冒泡排序|直接選擇排序|反轉(zhuǎn)排序
冒泡排序
基本思想是對比相鄰的元素值,如果滿足條件就交換值焙格,把較小的元素移動到數(shù)組前面图毕,反之把達的元素移動到數(shù)組后面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升到頂部眷唉。
算法示例:冒泡算法由雙層循環(huán)實現(xiàn)予颤,外層循環(huán)控制排序輪數(shù),一般為要排序的數(shù)組長度減一次(因為最后一次循環(huán)只剩下一個元素?zé)o需再對比了)內(nèi)層循環(huán)主要用于對比數(shù)組中的每個臨近元素的大小冬阳,以確定是否交換位置蛤虐,對比和交換次數(shù)隨著排序輪數(shù)而減少
public class BubbleSort {
public static void main(String args[]) {
//先創(chuàng)建一個亂序數(shù)組
int[] array = {24,56,11,66,32,8};
//創(chuàng)建冒泡排序類的對象
BubbleSort sorter = new BubbleSort();
//調(diào)用下面的排序方法
sorter.sort(array);
...
直接選擇排序
基本思想是將指定排序位置與其他數(shù)組元素分別相比,如果滿足條件就交換元素值(不是交換相鄰元素)肝陪,而是把滿足條件的元素與指定的排序位置交換驳庭,這樣好的位置逐漸擴大,最后整個數(shù)組都成為已排序好的格式算法示例:每一趟從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素饲常,順序地放在已排好序的數(shù)列的最后蹲堂,直到全部待排序的數(shù)據(jù)元素排完
public class SelectSort {...}
反轉(zhuǎn)排序
就是把數(shù)組最后一個元素與第一個元素替換歇拆,倒數(shù)第二個元素與第二個元素替換融虽,以此類推,直到所有數(shù)組元素反轉(zhuǎn)替換反轉(zhuǎn)排序是對數(shù)組兩邊的元素進行替換霸琴,所以只需要循環(huán)數(shù)組長度的半數(shù)次播聪,如數(shù)組長度為 7,那么 for 只要循環(huán) 3 次
public class ReverseSort {...}
數(shù)據(jù)結(jié)構(gòu)與算法是程序員求職路上的必經(jīng)之路...
學(xué)習(xí)算法最好通讀三四遍朽基,真正理解了之后再嘗試自己寫
第 7 章 類和對象 Classes and Objects
https://docs.oracle.com/javase/tutorial/java/javaOO/index.html
面向?qū)ο笤O(shè)計實質(zhì)上就是對現(xiàn)實世界的對象進行建模操作
對象 Object
通常對象劃分為兩個部分,靜態(tài)部分與動態(tài)部分
靜態(tài)部分离陶,顧名思義就是不能動的部分踩晶,這個部分被稱為屬性,任何對象都會具備其自身屬性枕磁,如一個人的高矮胖瘦渡蜻,而這個人可以說話、行走计济,這些事這個人具備的行為茸苇,也就是動態(tài)部分
在計算機世界中,面向?qū)ο蟪绦蛟O(shè)計的思想要以對象來思考問題沦寂,首先要將現(xiàn)實世界實體抽象為對象学密,然后考慮這個對象具備的行為(動態(tài)部分)
類 Class
類就是同一類事物的統(tǒng)稱,如果將現(xiàn)實世界的一個事物抽象成對象传藏,類就是這類對象的統(tǒng)稱在 Java 語言中腻暮,類中對象的行為是以方法的形式定義的,對象的屬性是以成員變量的形式定義的毯侦,而類包括對象的屬性和方法
封裝 Package
將對象的屬性和行為封裝起來哭靖,其載體就是類,類通常對客戶隱藏其實現(xiàn)細節(jié)侈离,這就是封裝的思想
{...}
繼承
繼承思想可以縮短軟件開發(fā)的時間试幽,復(fù)用那些已經(jīng)定義好的類,可以提高系統(tǒng)性能卦碾,減少系統(tǒng)在使用過程中出現(xiàn)錯誤得幾率
{...}
多態(tài)
{...}
this 關(guān)鍵字
this
關(guān)鍵字代表本類對象的引用
類的構(gòu)造方法
構(gòu)造方法是一個與類同名的方法铺坞,對象創(chuàng)建就是通過構(gòu)造方法完成的每當類實例化一個對象時,類都會自動調(diào)用構(gòu)造方法
構(gòu)造方法沒有返回值
構(gòu)造方法的名稱要與本類的名稱相同
static 靜態(tài)
被聲明為 static 的變量洲胖、常量和方法被稱為靜態(tài)成員济榨,靜態(tài)成員屬于類所有,區(qū)別于個別對象绿映,可以在本類或其他類使用類名和.
運算符調(diào)用靜態(tài)成員擒滑,語法為:類名.靜態(tài)類成員在靜態(tài)方法中不可以使用this 關(guān)鍵字和調(diào)用非靜態(tài)方法
類的主方法
public static void main(String[] args) {...}
主方法是靜態(tài)的,直接調(diào)用方法也必須是靜態(tài)的,主方法沒有返回值橘忱,性參為數(shù)組,其中 args[0]~args[n]分別代表程序的第一個參數(shù)到第 n 個參數(shù)卸奉,可使用 args.length 獲取參數(shù)個數(shù)
對象
Test test = new Test();
對象被創(chuàng)建出來時钝诚,就是一個對象的引用,并在內(nèi)存中為對象分配了存儲空間每個對象都算相互獨立的榄棵,在內(nèi)存中占據(jù)獨立的內(nèi)存地址凝颇,并且每個對象都具有自己的生命周期,當一個對象的生命周期結(jié)束時疹鳄,對象就變成垃圾拧略,由 Java 虛擬機自帶的垃圾回收機制處理,不能再被使用
public class CreateObject {
public CreateObject() {
System.out.println("創(chuàng)建對象");
}
public static void main(String args[]) {
new CreateObject();
}
}
在上述實例的主方法中使用 new 操作符創(chuàng)建對象創(chuàng)建對象的同時瘪弓,將自動調(diào)用構(gòu)造方法中的代碼
訪問對象的屬性和行為
使用對象.類成員
獲取對象的屬性和行為
對象的比較
使用==
運算符與equals()
方法前者為比較引用地址是否相等
后者為String類
方法垫蛆,比較內(nèi)容
對象的銷毀
每個對象都有生命周期,當對象的生命周期結(jié)束時腺怯,分配給給對象的內(nèi)存地址將會被回收對象引用超過其作用范圍袱饭,這個對象將被視為垃圾對象賦值為null
總結(jié)
本章學(xué)習(xí)了
面向?qū)ο蟮母拍?/code>
類的定義
成員方法
類的構(gòu)造方法
主方法
對象的應(yīng)用
在此基礎(chǔ)上可以編寫類
定義類成員
構(gòu)造方法
主方法
類及類成員可以使用權(quán)限修飾符
進行修飾,對象的創(chuàng)建
比較
銷毀
十分重要
本章只點到了類和對象呛占,仍需通過編碼去深刻理解面向?qū)ο?OOP 的概念
第 8 章 包裝類
第 9 章 數(shù)學(xué)類
鑒于此類屬于 api 的范疇虑乖,先重點學(xué)面向?qū)ο蟮奶匦裕@些內(nèi)容可以以后需要時再補充
Day 4 (#0521)
上午英語課期中考試寫完試卷就來圖書館看書了晾虑,周一周二的課又多又無趣
今天看到了焦慮的話題疹味,回想這幾天,有了專一的學(xué)習(xí)目標(JavaV钠)并且充分利用好了時間糙捺,完全沒有以前那種焦慮的感覺了(以前是目標太分散,又不想玩又不想學(xué)笙隙,所以很焦慮)
今天學(xué)習(xí)面向?qū)ο蟮母拍畈惶菀准陶遥欠駪?yīng)該邊看代碼邊敲邊思考?
第 10 章 繼承逃沿、多態(tài)與接口
本章為 Java 面向?qū)ο筇匦缘膶W(xué)習(xí)婴渡,一下子不太好理解,需要多花點時間琢磨凯亮,多回來看看边臼,寫代碼體驗特性
繼承 extend
在 Java 中使用extends
關(guān)鍵字來標識兩個類的繼承關(guān)系
class Father {...}
class Son extends Father {...}
這里 Son 類繼承了 Father 類(類名不重要)
super 關(guān)鍵字
super()
語句調(diào)用父類的構(gòu)造方法
super
關(guān)鍵字調(diào)用父類的成員方法但子類沒有權(quán)限調(diào)用父類中被修飾為privite
的方法,只可調(diào)用public
和 protected
的成員方法
重寫與重構(gòu)
重寫就是在子類中將父類的成員方法的名稱保留假消,重寫成員方法的實現(xiàn)內(nèi)容柠并,更改成員方法的存儲權(quán)限,或是修改成員方法的返回值類型
當重寫父類方法時,修改方法的修飾權(quán)限只能從小的范圍到大的范圍改變
重構(gòu)就是子類與父類的成員方法返回值臼予、方法名稱鸣戴、參數(shù)類型及個數(shù)完全相同,唯一不同的是方法實現(xiàn)內(nèi)容**
Object 類 所有類的爸爸
在 Java 中粘拾,所有的類都直接或間接繼承了java.lang.Object
類
Object 類是比較特殊的類窄锅,它是所有類的父類,是 Java 類層中最高層類
由于所有的類都是 Object 類的子類缰雇,所以任何類都可以重寫 Object 類中的方法
getClass()方法
是 Object 類定義的方法入偷,它會返回對象執(zhí)行時的 Class 實例,然后調(diào)用 getName()方法可以取得類的名稱
getClass().getname();
可將 getClass()方法與 toString()方法聯(lián)合使用
toString()方法
是將一個對象返回為字符串形式
equals()方法
==
比較的是兩個對象的引用是否相等械哟,而equals()
比較兩個對象的實際內(nèi)容
書中此處有個實例疏之,與上文反道而行之,不太懂
對象類型的轉(zhuǎn)換 向上轉(zhuǎn)型|向下轉(zhuǎn)型
暫未理解
使用instanceof判斷對象類型
可使用instanceof
操作符判斷是否一個類實現(xiàn)了某個借口暇咆,也可判斷一個實例對象是否屬于一個類
myobject instanceof ExampleClass
表達式返回值為布爾boolean值锋爪,true & false,可搭配if等語句使用...
方法的重載
為了讓方法名相同而形參不同的構(gòu)造方法存在,必須用到方法重載
方法的重載就是在同一個類中允許同時存在一個以上的同名方法爸业,只要這些方法的參數(shù)個數(shù)或類型不同即可
不定長參數(shù)方法:
public static int add(int...a) {...}
返回值 方法名(參數(shù)數(shù)據(jù)類型...參數(shù)名稱)
不定長參數(shù)a就是一個數(shù)組几缭,可搭配循環(huán)語句使用
多態(tài)
hmmm...not easy to understand
抽象類 abstract
在解決實際問題時,一般將父類定義為抽象類沃呢,需要使用這個父類進行繼承與多態(tài)處理年栓,繼承樹越中越是在上方的類越抽象
在Java中設(shè)置抽象類不可實例化對象,但它的子類可以
抽象類的語法
public abstract class TestClass{
abstract void testAbstarct(); //定義抽象類方法
}
抽象類沒有方法體薄霜,這個方法本身沒有意義某抓,除非它被重寫,而承載這個抽象方法的抽象類必須被繼承惰瓜,抽象類除了被繼承之外沒有任何意義
只要類中有一個抽象方法否副,此類就被標記為抽象類
抽象類被繼承后需要實現(xiàn)其中所有的抽象方法,也就是保證相同的方法名稱崎坊、參數(shù)列表和相同返回值類型創(chuàng)建出非抽象方法备禀,當然也可以是抽象方法
接口 interface
接口是抽象類的延伸,可以將它看作是純粹的抽象類奈揍,接口中的所有方法都沒有方法體
public interface drawInterface{
void draw(); //接口內(nèi)的方法省略abstract抽象關(guān)鍵字
}
一個類實現(xiàn)一個接口可以使用implements關(guān)鍵字
class PXSbianxing extends Sbianxing implements drawInterface{...}
實現(xiàn)
在接口中定義的方法必須被定義為public或abstract形式曲尸,在接口中定義的任何字段都是static和final的
Java中不允許多重繼承,但使用接口就可以男翰,可以將所有需要繼承的接口放置在implements關(guān)鍵字后并逗號隔開
總結(jié)
了解繼承與多態(tài)的機制另患,掌握重載類型轉(zhuǎn)換,學(xué)會使用接口與抽象類
依然不好懂
Day 5 (#0522)
面向?qū)ο蟮奶匦源_實不易懂蛾绎,囫圇吞棗地學(xué)或者找點視頻看昆箕,通讀幾遍概念鸦列,過段時間再回來回顧一下應(yīng)該就可以了
第 11 章 類的高級特性
Java類包 package
Java中提供了一種管理類文件的機制,就是類包
為了防止類名沖突鹏倘,將兩個同名類放置在不同的包中
java.util.Date date = new java.util.Date();
package 包名 //定義包
import 包名 //導(dǎo)入包
導(dǎo)入靜態(tài)成員并使用
import static java.lang.Math.max;
import static java.lang.System.out;
class ImportTest {
public static void main(String args[]) {
//直接使用靜態(tài)成員
out.println("1和4的較大值為" + max(1, 4))
}
}
final 變量
final關(guān)鍵字可用于變量聲明薯嗤,設(shè)置后不可改變該變量的值,通常final定義的變量為常量
final關(guān)鍵字定義的變量必須在聲明時賦值
final double PI = 3.14; //常量名 通常大寫
定義為final的數(shù)據(jù)無論是常量纤泵、對象引用還是數(shù)組骆姐,在主函數(shù)中都不可以被改變
final定義的對象引用只能指向一個對象,不可再指向其他對象夕吻,但對象本身的值是可以改變的
使用static final
關(guān)鍵字使內(nèi)存區(qū)域的值恒定不變
聲明final變量不賦值的诲锹,稱為空白final繁仁,可在構(gòu)造方法中賦值
構(gòu)造方法就是和類名相同的方法
final 方法
定義為final
的方法不能被重寫
但是父類被定義為private final
的方法似乎可以被子類覆蓋
class Parents {
private final void doit() {
System.out.println("First doit");
}
final void doit2() {
System.out.println("First doit2");
}
public void doit3() {
System.out.println("First doit3");
}
}
class Sub extends Parents {
public final void doit() {
System.out.println("Sub doit");
}
//final void doit2() {} //final方法不能覆蓋
public void doit3() {
System.out.println("Sub doit3");
}
}
public class Finals {
public static void main(String[] args) {
Sub s = new Sub();
s.doit();
Parents p = s; //向上轉(zhuǎn)型
//p.doit(); //不能調(diào)用private方法
p.doit2();
p.doit3();
}
}
可見final方法不能被覆蓋涉馅,向上轉(zhuǎn)型操作后,對象p只能調(diào)用正常覆蓋的doit3()方法黄虱,卻不能調(diào)用doit()方法稚矿,可見子類中的doit()方法并不是正常覆蓋,而是生成一個新的方法
final 類
定義為final的類不能被繼承
如果將某個類設(shè)置為final形式捻浦,則類中的所有方法都被隱式設(shè)置為final形式
但是final類中的成員變量可以被定義為final或非final形式
//final class
final class FinalClass {
int a = 3;
void doit() {
}
public static void main(String[] args) {
FinalClass finalClass = new FinalClass();
finalClass.a++;
System.out.println(finalClass.a);
}
}
內(nèi)部類
如果在類中再定義一個類晤揣,稱為內(nèi)部類
成員內(nèi)部類
在內(nèi)部類中可以隨意使用外部類的成員方法以及成員變量,盡管成員修飾為private
內(nèi)部類的實例一定要綁定在外部類的實例上朱灿,如果從外部類中初始化一個內(nèi)部類對象昧识,那么內(nèi)部類對象就會綁定在外部類對象上。
內(nèi)部類初始化方式與其他類初始化方式相同盗扒,都是用new關(guān)鍵字跪楞。
//innerClass
class OuterClass {
innerClass in = new innerClass();
public void out() {
in.inf();
}
class innerClass {
innerClass() {
}
public void inf() {
}
int y = 0;
}
public innerClass doit() {
// y = 4;
in.y = 4;
return new innerClass();
}
public static void main(String[] args) {
OuterClass out = new OuterClass();
OuterClass.innerClass in = out.doit();
OuterClass.innerClass in2 = out.new innerClass();
}
}
內(nèi)部類可以訪問它的外部類成員,但內(nèi)部類成員只有在內(nèi)部類的范圍內(nèi)是可知的侣灶,不能被外部類使用甸祭。
在實例化內(nèi)部類對象時,不能在new操作符之前使用外部類名稱實例化對象褥影,而是應(yīng)該使用外部類的對象來創(chuàng)建其內(nèi)部類的對象池户。
內(nèi)部類向上轉(zhuǎn)型為接口
{...}
使用this關(guān)鍵字獲取內(nèi)部類與外部類的引用
如果在外部類中定義的成員變量與內(nèi)部類中哦的成員變量名相同,可以使用this關(guān)鍵字
public class TheSameName {
private int x;
private class Inner { //Inner內(nèi)部類
private int x = 9;
public void doit(int_x) {
x++; //^^^
this.x++; //Inner class
TheSameName.this.x++; //TheSameName class
}
}
}
局部內(nèi)部類
內(nèi)部類不僅可以在類中進行定義凡怎,也可以在類的局部位置定義校焦,如在類的方法或任意的作用域中均可以定義內(nèi)部類
如果需要在方法體中使用局部變量,該局部變量需要被設(shè)置為fina類型
方法中定義的內(nèi)部類只能訪問方法中final類型的局部變量统倒,這是因為在方法中定義的局部變量相當于一個常量斟湃,它的生命周期超出方法運行的生命周期,由于該局部變量被設(shè)置為final檐薯,所以不能在內(nèi)部類中改變該局部變量的值
匿名內(nèi)部類
class OuterClass4 {
public OutInterface2 doit() {
return new OuterInterface2() { //聲明匿名內(nèi)部類
private int i = 0;
public int getValue() {
return i;
}
}; //匿名內(nèi)部類定義結(jié)束分號
}
}
匿名內(nèi)部類語法如下
return new ClassName() {
//...
};
匿名內(nèi)部類使用默認構(gòu)造方法來生成OutInterface2對象
定義結(jié)束后要加;分號凝赛,代表創(chuàng)建OutInterface2引用表達式
靜態(tài)內(nèi)部類
在內(nèi)部類前添加static
就變?yōu)殪o態(tài)內(nèi)部類了
一個靜態(tài)內(nèi)部類中可以聲明static成員注暗,但是在非靜態(tài)內(nèi)部類中不可聲明靜態(tài)成員
靜態(tài)內(nèi)部類的特點:
不可使用外部類的非靜態(tài)成員(所以靜態(tài)內(nèi)部類較為少見)
創(chuàng)建靜態(tài)內(nèi)部類的對象,不需要其外部類的對象
內(nèi)部類的繼承
內(nèi)部類也可以繼承但比繼承普通類復(fù)雜墓猎,需設(shè)置專門的語法來完成
//extend InClass
class ClassA {
class ClassB {
}
}
class OutClass extends ClassA.ClassB { //繼承內(nèi)部類ClassB
public OutClass(ClassA a) {
a.super();
}
}
在某個類繼承內(nèi)部類時捆昏,必須給予這個類一個帶參數(shù)的構(gòu)造方法,并且該構(gòu)造方法的參數(shù)為需要繼承內(nèi)部類的外部類的引用毙沾,同時在構(gòu)造方法體中使用a.super()語句骗卜,這樣才為繼承提供了必要的對象引用
總結(jié)
本章學(xué)習(xí)了Java語言的包
final關(guān)鍵字
內(nèi)部類
學(xué)會如何導(dǎo)入包
定義final變量
final方法
final類
內(nèi)部類的用法
OOP不算很好懂。