【狂神說(shuō)Java】Java零基礎(chǔ)學(xué)習(xí)視頻通俗易懂


學(xué)習(xí)路線

寫(xiě)博客的重要性

DOS:Disk Operation System
alt+f4 關(guān)閉窗口
shift+del 永久刪除
運(yùn)行窗口下新建任務(wù):explorer //顯示桌面
shitf+右鍵 打開(kāi)powershell

JavaSE服務(wù)端
Java EE企業(yè)端
Java ME移動(dòng)端

java優(yōu)勢(shì):
簡(jiǎn)單性、面向?qū)ο?、可移植、高性能、分布式、?dòng)態(tài)性、多線程、安全性、健壯性
學(xué)習(xí)Java的特性,主動(dòng)愛(ài)上Java的魅力
Write once,Run anywhere
JDK、JRE、JVM的關(guān)系

編譯javac xx.java
運(yùn)行Java xx
文件名和類(lèi)名必須保持一致
Java程序運(yùn)行機(jī)制
編譯型:一次編譯,隨時(shí)運(yùn)行
解釋型:每次從頭運(yùn)行

idea中
#生成一個(gè)main方法 psvm
#打印 sout
書(shū)寫(xiě)注釋是一個(gè)非常好的習(xí)慣
三種注釋:
- 單行注釋 //
- 多行注釋 /* */
- 多行注釋/** */
- 文檔注釋
標(biāo)識(shí)符:類(lèi)名、變量名和方法名都被稱為標(biāo)識(shí)符
關(guān)鍵字

標(biāo)識(shí)符:數(shù)字、字母、下劃線組成,其中數(shù)字不能作為開(kāi)頭,不能使用關(guān)鍵字作為變量名和方法名,標(biāo)識(shí)符大小寫(xiě)敏感
Java是一種強(qiáng)類(lèi)型語(yǔ)言,先定義后使用
數(shù)據(jù)類(lèi)型:基本類(lèi)型(byte、short、int、long、float、double、Boolean、char)、引用類(lèi)型(接口、類(lèi)、數(shù)組)

float后面的參數(shù)要加F,因?yàn)楦↑c(diǎn)數(shù)默認(rèn)是double
long后面的參數(shù)要加L
浮點(diǎn)數(shù)盡量避免比較,使用Big Decimal數(shù)學(xué)工具類(lèi)比較
所有字符本質(zhì)都是數(shù)字
Unicode編碼給每個(gè)字符一個(gè)編號(hào)
#轉(zhuǎn)義字符 \u
#換行 \n
#制表符 \t
Boolean默認(rèn)為true
多字節(jié)強(qiáng)制轉(zhuǎn)換成低字節(jié)會(huì)照成內(nèi)存溢出
#(類(lèi)型)變量名
強(qiáng)制轉(zhuǎn)換:高->低 //可能會(huì)照成損失精度或內(nèi)存溢出,比如int轉(zhuǎn)char就不會(huì)錯(cuò)誤
自動(dòng)轉(zhuǎn)換:低->高 //自動(dòng)填充
強(qiáng)制類(lèi)型轉(zhuǎn)換可以在定義時(shí)強(qiáng)轉(zhuǎn),也可以在輸出時(shí)強(qiáng)轉(zhuǎn)
shift+F10自動(dòng)運(yùn)行
數(shù)字可以這樣表示1000_0000_000
三種變量:

常量:final double PI=3.14;

# 運(yùn)算符

CTRL+D復(fù)制當(dāng)前行到下一行
【cast:V.轉(zhuǎn)換】
運(yùn)算符
++ 自增
--自減
a++ //a先賦值再自增1
++a //a先自增1再賦值

#冪函數(shù)計(jì)算 double pow =Math.pow(2,3) //8,很多運(yùn)算會(huì)使用一些工具類(lèi)來(lái)運(yùn)算

#輸出字符串加結(jié)果:System.out.println("a&&b的結(jié)果:"+(a&&b));
短路運(yùn)算

異或:相同為0,不同為1
面試題:2^4怎么算最快
答:位運(yùn)算往左移2位
位運(yùn)算

a+=b //等價(jià)于a=a+b
面試題:int+String和String+int的不同

三元運(yùn)算符
x?a:b X為true返回a,否則返回b
包機(jī)制
公司利用域名倒置作為包名,如com.baidu.www
#定義包 package 包名
#導(dǎo)包import package
import java.util.Date //導(dǎo)入Date包
【param:參數(shù)】
/**+Enter //輸出參數(shù)

Java Doc參數(shù)信息
#生成文件 javadoc -encoding UTF-8 -charset UTF-8 xx.java
# java流程控制
Scanner對(duì)象
#獲取用戶輸入:java.util.Scanner
【util】全稱utility,一種實(shí)用的包
Scanner s=new Scanner(System.in);
通過(guò)next()和nextLine()方法獲取輸入的字符串,讀取前用hasNext()和hasNextLine判斷是否還有輸入的數(shù)據(jù)
區(qū)別:


Summary:

Ctrl+左鍵,點(diǎn)擊類(lèi)名查看它的方法
# 順序結(jié)構(gòu)
#選擇結(jié)果
#if多選擇結(jié)構(gòu):

規(guī)則:

#if嵌套結(jié)構(gòu)
if(){ if() }else
#switch case結(jié)構(gòu)
switch(條件){
case'A':
break; //可選,如果滿足A則不輸出后面的內(nèi)容
case‘B’:
default: //可選,如果都不滿足則輸出此條件下的內(nèi)容
}
//case后可跟字符串,Jdk7新特性
#idea反編譯:把class文件和放在源Java所對(duì)應(yīng)的工程文件夾下,在idea下打開(kāi)class文件

#while循環(huán)
- 只要布爾表達(dá)式為true,循環(huán)會(huì)一直執(zhí)行下去
- 大部分情況需要讓循環(huán)停止下來(lái)
- 小部分情況需要一直執(zhí)行,比如服務(wù)器的請(qǐng)求監(jiān)聽(tīng)
#do...while:至少會(huì)執(zhí)行一次
while和do...while的區(qū)別:
- do...while至少會(huì)執(zhí)行一次
- while先判斷后執(zhí)行,do...while先執(zhí)行后判斷
- do...while總是保證循環(huán)體至少執(zhí)行一次
#for循環(huán)
關(guān)于for:
1、最先執(zhí)行初始化步驟,可以聲明一種類(lèi)型,但可初始化一個(gè)或多個(gè)循環(huán)控制變量,也可以是空語(yǔ)句
2、中間是布爾表達(dá)式
3、執(zhí)行一次循環(huán),更新循環(huán)控制變量
4、再次檢查布爾表達(dá)式,循環(huán)執(zhí)行上面的過(guò)程
#簡(jiǎn)化,如for(int i; i<100;i++),簡(jiǎn)化后for( ;i<100;i++); //簡(jiǎn)化后要提前聲明并賦值給i
#死循環(huán)for( ; ; ){ }
#增強(qiáng)for循環(huán):用于數(shù)組或集合

#break用于強(qiáng)行退出循環(huán),不執(zhí)行循環(huán)剩余的語(yǔ)句(break也可在switch語(yǔ)句中使用)
#continue語(yǔ)句用在循環(huán)體中,跳過(guò)尚未執(zhí)行的語(yǔ)句,并進(jìn)行下一次是否執(zhí)行循環(huán)的判定
#兩個(gè)作業(yè):九九乘法表和打印正三角形(5行)
# 學(xué)會(huì)打斷點(diǎn):能夠知道程序的運(yùn)行機(jī)制
步過(guò):一行一行的往下走,不會(huì)進(jìn)入到其他方法的內(nèi)部。
步入:如果當(dāng)前行有方法執(zhí)行,可以進(jìn)入方法的內(nèi)部(不會(huì)進(jìn)入官方定義的方法,僅能進(jìn)入自定義的方法)。
強(qiáng)制步入:如果當(dāng)前行有方法執(zhí)行,可以進(jìn)入方法的內(nèi)部(可以進(jìn)入官方定義的方法,這在查看底層源碼時(shí)非常有用)。
智能步入:如果當(dāng)前行有多個(gè)方法同時(shí)被執(zhí)行,IDEA 將會(huì)詢問(wèn)你要進(jìn)入哪個(gè)方法。
步出:從步入的方法內(nèi)執(zhí)行完該方法,然后退出到方法調(diào)用處。
重置 Frame:恢復(fù)到上一個(gè)斷點(diǎn)的開(kāi)始處。
————————————————
#方法
如:System.out.println() //System是類(lèi),out是對(duì)象,println是方法 ,即調(diào)用System類(lèi)下out對(duì)象的一個(gè)方法println
形參:用來(lái)定義作用的
實(shí)參:實(shí)際調(diào)用傳遞給他的參數(shù)


Java是值傳遞
#方法的重載:在一個(gè)類(lèi)中,有相同的函數(shù)名稱,但形參不同的函數(shù)
規(guī)則:
- 方法名稱必須相同
- 參數(shù)列表必須不同(個(gè)數(shù)不同、或類(lèi)型不同等)

# 用命令行給方法傳遞參數(shù)

在src目錄下運(yùn)行,同時(shí)后面跟上參數(shù)

# 可變參數(shù)
指定參數(shù)類(lèi)型后加一個(gè)省略號(hào)(...)
一個(gè)方法只能指定一個(gè)可變參數(shù),它必須是方法的最后一個(gè)參數(shù),如何普通的參數(shù)必須在它之前申明。
public static void main(String args[]){ int 1,2,3,4}
public static void a(int...i){ }
#遞歸結(jié)構(gòu):
- 遞歸頭:什么時(shí)候不調(diào)用自身方法。如果沒(méi)有頭,將陷入死循環(huán)。
- 遞歸體:什么時(shí)候調(diào)用自身方法。
邊界條件:遞歸有一個(gè)盡頭邊界
前階段:未達(dá)到邊界條件前的階段
返回階段:n*(n-1)

原理:棧機(jī)制
小點(diǎn)的數(shù)可以用棧機(jī)制可以快速解決問(wèn)題,大量數(shù)據(jù)不要使用棧機(jī)制,這樣會(huì)照成內(nèi)存溢出
#寫(xiě)一個(gè)計(jì)算器
思路:
- 寫(xiě)4個(gè)方法:加減乘除
- 利用循環(huán)+switch進(jìn)行用戶交互
- 傳遞需要操作的兩個(gè)數(shù)
- 輸出結(jié)果
[鏈接](https://blog.csdn.net/EasonYoung1/article/details/131495075?spm=1001.2014.3001.5501)
# 數(shù)組
- 數(shù)組聲明:int[ ] nums;
- 使用new創(chuàng)建數(shù)組,分配空間:
nums=new int[3];//存放3個(gè)int類(lèi)型的數(shù)字,這里的3是空間大小,不是數(shù)組下標(biāo)
- 聲明同時(shí)創(chuàng)建int[ ] nums=new int[3]
- 給數(shù)組元素賦值
nums[0]=1;
nums[1]=3;
nums[2]=5;
nums[3]=7;
- 數(shù)組長(zhǎng)度 nums.length
## 數(shù)組特點(diǎn):

1、長(zhǎng)度不可變
2、元素必須相同
3、元素可以是基本類(lèi)型和引用類(lèi)型
4、數(shù)組對(duì)象屬于引用類(lèi)型,數(shù)組可看作對(duì)象,每個(gè)元素相當(dāng)于成員變量
數(shù)組本身就是對(duì)象,Java中對(duì)象是在堆中的,無(wú)論數(shù)組保存原始類(lèi)型還是其他對(duì)象類(lèi)型,數(shù)組本身是在堆中的。
#內(nèi)存分析(堆、棧和方法區(qū))

聲明數(shù)組放入棧
創(chuàng)建數(shù)組放入堆,在堆中開(kāi)辟一塊區(qū)域
## 三種初始化
- 靜態(tài)初始化
int[ ] a={1,3,5};//創(chuàng)建直接賦值
- 動(dòng)態(tài)初始化
int[ ] a=new int[3];//創(chuàng)建并分配3個(gè)空間
- 默認(rèn)初始化
數(shù)組是引用類(lèi)型,其元素相當(dāng)于類(lèi)的實(shí)例變量,一旦數(shù)組被分配空間,數(shù)組每個(gè)元素被按照實(shí)例變量同樣的方式被隱式初始化
## 數(shù)組使用
- For-Each循環(huán)
- 數(shù)組作方法入?yún)?/li>
- 數(shù)組作返回值
## 二維數(shù)組
在一維數(shù)組的基礎(chǔ)上,每一個(gè)元素都是一個(gè)數(shù)組
int a[ ][ ]=new int [1][2];//可看作一個(gè)兩行三列的數(shù)組

int[ ] [ ] array={{1,2},{3,2},{2,0}};//看作3行兩列的數(shù)組
#Arrays類(lèi)
- 先導(dǎo)包import java.util.Arrays;
- 再使用Arrays.toString(類(lèi)型【】 數(shù)組名);
Arrays.fill(int[] 數(shù)組名)//填充數(shù)組
# 稀疏數(shù)組

當(dāng)一個(gè)數(shù)組中大部分元素是0,或?yàn)橥恢档臄?shù)組時(shí),可以使用稀疏數(shù)組來(lái)保存該數(shù)組
- 處理方式:
- 記錄幾行幾列,有多少不同值
- 把不同值元素和行列及值記錄在一個(gè)小規(guī)模數(shù)組中,從而縮小程序的規(guī)模
#打印一個(gè)稀疏數(shù)組
#面向?qū)ο?/strong>
return:結(jié)束方法,返回一個(gè)結(jié)果
break:跳出當(dāng)前循環(huán)
屬性+方法就是一個(gè)類(lèi)
面向過(guò)程:步驟清晰簡(jiǎn)單,適合處理簡(jiǎn)單問(wèn)題
面向?qū)ο螅何镆灶?lèi)聚,分類(lèi)思維模式,適合處理復(fù)雜問(wèn)題
#面向?qū)ο蟮谋举|(zhì):
以類(lèi)的方式組織代碼,以對(duì)像的組織(封裝)數(shù)據(jù)
三大特性:封裝、繼承、多態(tài)
類(lèi)分靜態(tài)類(lèi)和非靜態(tài)類(lèi),非靜態(tài)類(lèi)要實(shí)例化才能使用
public class Student{
String name;
}
public static void main{
Student student=new Student(); //實(shí)例化
student.name="ian";//賦值
sout+student.name //(偽代碼)輸出
}
## 創(chuàng)建與初始化對(duì)象
使用new關(guān)鍵字創(chuàng)建對(duì)象:
- 使用new關(guān)鍵字創(chuàng)建,除了分配內(nèi)存空間,還會(huì)給創(chuàng)建好的對(duì)象進(jìn)行默認(rèn)的初始化,以及對(duì)類(lèi)中構(gòu)造器的調(diào)用。
- 類(lèi)中的構(gòu)造器也稱為構(gòu)造方法,是在進(jìn)行創(chuàng)建對(duì)象時(shí)必須要調(diào)用的,特點(diǎn)如下
1、必須和類(lèi)名相同
2、必須沒(méi)有返回類(lèi)型,不能寫(xiě)void
* 作用: * 1、new本質(zhì)在調(diào)用構(gòu)造方法 * 2、初始化對(duì)象的值 * 注意:定義有參構(gòu)造后,如果使用無(wú)參構(gòu)造,可以定義一個(gè)無(wú)參構(gòu)造 * * 創(chuàng)建構(gòu)造器快捷鍵:ALT+Insect * this.對(duì)象 //this指當(dāng)前類(lèi)
#內(nèi)存分析:



小結(jié):
1、類(lèi)與對(duì)象
類(lèi)是一個(gè)模板:抽象
對(duì)象是一個(gè)具體實(shí)例
2、方法:定義與調(diào)用
3、對(duì)象的引用
引用類(lèi)型:基本類(lèi)型
對(duì)象是提高引用來(lái)操作的:棧->堆
4、屬性:字段field 成員變量
默認(rèn)初始化:
數(shù)字 0 0.0
char: u0000
boolean: false
引用:null
5、對(duì)象的創(chuàng)建與使用
必須使用new創(chuàng)建對(duì)象,建立構(gòu)造器
對(duì)象的屬性 ian.name
對(duì)象的方法 ian.fx()
6、類(lèi)
靜態(tài)的屬性 屬性
動(dòng)態(tài)的行為 方法
# 封裝:
高內(nèi)聚、低耦合
高內(nèi)聚:類(lèi)的內(nèi)部操作細(xì)節(jié)自己完成,不允許外部干涉
低耦合:僅暴露少量的方法給外部使用
屬性私有,get/set
set中可以對(duì)接收的數(shù)據(jù)判斷是否合法,進(jìn)行操作
Alt+Insect 快捷生成
意義:
1、提高程序的安全性,保護(hù)數(shù)據(jù)
2、隱藏代碼實(shí)現(xiàn)的細(xì)節(jié)
3、統(tǒng)一接口
4、系統(tǒng)的可維護(hù)性增加了
# 繼承
子類(lèi)在類(lèi)定義時(shí):
public class Person(){} //父類(lèi)
public class extends Person(){} //子類(lèi)
Ctrl+H //查看層次結(jié)構(gòu)
所有的類(lèi),都直接或間接繼承object類(lèi)
知識(shí)點(diǎn):
- java中只有單繼承,沒(méi)有多繼承。一個(gè)兒子只有一個(gè)爸爸,一個(gè)爸爸可以有多個(gè)兒子
- 繼承是類(lèi)和類(lèi)之間的一種關(guān)系。除此之外,類(lèi)和類(lèi)之間還有依賴、組合、聚合等。
object類(lèi)
super
方法重寫(xiě)
# super
注意點(diǎn):
1、super調(diào)用父類(lèi)的構(gòu)造方法,必須在構(gòu)造方法的第一個(gè)
2、super必須只能在子類(lèi)的方法或構(gòu)造方法中!

3、super和this不能同時(shí)調(diào)用方法!
對(duì)比this:
1、代表的對(duì)象不同:
- this:本身調(diào)用這個(gè)對(duì)象
- super代表父類(lèi)對(duì)象的引用
2、前提:
- this:沒(méi)有繼承也可以使用
- super:只能在繼承條件下才可以使用
3、構(gòu)造方法
- this():本類(lèi)的構(gòu)造
- super():父類(lèi)的構(gòu)造
方法的重寫(xiě):重寫(xiě)的方法的重寫(xiě),與屬性無(wú)關(guān)
//靜態(tài)方法的調(diào)用只和左邊,定義的數(shù)據(jù)類(lèi)型有關(guān) //非靜態(tài)的方法能重寫(xiě)
- 重寫(xiě):需要有繼承關(guān)系,子類(lèi)重寫(xiě)父類(lèi)的方法:
1、方法名必須相同
2、參數(shù)列表必須相同
3、修飾符:范圍可以擴(kuò)大,不能縮小:
private<Default<protected<public
4、拋出的異常:范圍,可以縮小,但不能擴(kuò)大:
ClassNotFoundException->Exception(大)
5、子類(lèi)的方法和父類(lèi)要一致,方法體不同。
重寫(xiě)的意義:父類(lèi)的功能,子類(lèi)不一定需要,或不一定滿足!
Alt+O;override
多態(tài):
同一個(gè)方法可以根據(jù)發(fā)送對(duì)象的不同而采取多種不同的行為方式
一個(gè)對(duì)象的實(shí)際類(lèi)型的確定的,但可以指向?qū)ο蟮囊妙?lèi)型有很多(父類(lèi),有關(guān)系的類(lèi))
多態(tài)存在的條件
1、有繼承關(guān)系
2、子類(lèi)重寫(xiě)父類(lèi)方法
3、父類(lèi)引用指向子類(lèi)對(duì)象
注意:多態(tài)是方法的多態(tài),屬性沒(méi)有多態(tài)性
instanceof 判斷兩個(gè)對(duì)象是否有聯(lián)系
(類(lèi)型轉(zhuǎn)換)引用類(lèi)型
eg: ((Student) s2). fx();
抽象類(lèi):abstract
1、不能new這個(gè)抽象類(lèi),只能在子類(lèi)去實(shí)現(xiàn)它:約束!
2、抽象類(lèi)可以寫(xiě)普通方法
3、抽象方法必須在抽象類(lèi)中
4、new,存在構(gòu)造器
# 接口
普通類(lèi):只有具體實(shí)現(xiàn)
抽象類(lèi):具體實(shí)現(xiàn)和規(guī)范(抽象方法)都有
接口:只有規(guī)范!自己無(wú)法寫(xiě)方法~專業(yè)的約束!約束和實(shí)現(xiàn)分離:面向接口編程
- 接口就是規(guī)范,定義的是一組規(guī)則,體現(xiàn)了現(xiàn)實(shí)世界中“如果你是...則必須能...”的思想
- 接口的本質(zhì)是契約
- oo的精髓,是對(duì)對(duì)象的抽象
接口關(guān)鍵字:interface
實(shí)現(xiàn)類(lèi)關(guān)鍵字:implement
內(nèi)部類(lèi)
內(nèi)部類(lèi)就是在一個(gè)類(lèi)的內(nèi)部再定義一個(gè)類(lèi),如,A類(lèi)定義一個(gè)B類(lèi),那么B類(lèi)相對(duì)于A類(lèi)來(lái)說(shuō)稱為內(nèi)部類(lèi),A類(lèi)相對(duì)于B類(lèi)來(lái)說(shuō)就是外部類(lèi)
1、成員內(nèi)部類(lèi)
2、靜態(tài)內(nèi)部類(lèi)
3、局部?jī)?nèi)部類(lèi)
4、匿名內(nèi)部類(lèi)
# 異常


異常體系結(jié)構(gòu):

Error:
Error類(lèi)對(duì)象由Java虛擬機(jī)生成并拋出,大多數(shù)錯(cuò)誤與代碼執(zhí)行者所執(zhí)行的操作無(wú)關(guān)

Exception:
在Exception分支中有一個(gè)中有一個(gè)重要的子類(lèi)RuntimeException(運(yùn)行時(shí)異常)



Alt+Enter 處理波浪線