一排截、JDK(Java 開發(fā)工具集)1.8 安裝與配置
1娱节、安裝JDK距帅,注意OS系統(tǒng)的位數(shù) 32|64
2、配置環(huán)境變量
用戶變量:只用于當(dāng)前用戶
系統(tǒng)變量:用于所有用戶
path括堤、classpath碌秸,注意:不區(qū)分大小寫
path:C:\Program Files\Java\jdk1.8.0_101\bin 一系列可執(zhí)行文件目錄,比如:java.exe
classpath:.;C:\Program Files\Java\jdk1.8.0_101\lib\tools.jar 一系列核心類庫
3悄窃、安裝好JDK, 安裝目錄下有倆個文件:jdk與jre
jdk:開發(fā)環(huán)境+運行環(huán)境
存在 javac.exe可執(zhí)行文件
存在 java.exe
jdk中存在jre
jre:運行環(huán)境
不存在 javac.exe可執(zhí)行文件
存在 Java.exe
Java是一種編譯性語言:
先編譯:javac .java讥电,屬于開發(fā)過程;編譯后生成.class(字節(jié)碼)文件
后執(zhí)行:java 轧抗,屬于程序執(zhí)行過程
注意:是類名
4恩敌、常用命令:
javac:編譯Java源文件,生成字節(jié)碼文件
-d 指定Java源文件所在位置
D:\java_demo\temp> javac -d . D:\java_demo\20160726\HelloWorld.java
查找其他目錄下的Java源文件横媚,編譯生成字節(jié)碼文件存放當(dāng)前目錄纠炮。
指定Java源文件編譯后的class字節(jié)碼文件的存放目錄
D:\java_demo\20160726> javac -d D:\java_demo\class HelloWorld.java
當(dāng)前目錄下編譯Java源文件,將生成的字節(jié)碼文件存放指定其他目錄下灯蝴。
-cp 指定查找用戶類文件的位置
D:\java_demo\20160726> java -cp D:\java_demo\temp HelloWord
查找其他目錄下的字節(jié)碼文件恢口,解釋執(zhí)行該文件。
java:執(zhí)行字節(jié)碼(.class)文件穷躁,展示運行效果
javadoc:生成幫助API文檔
javadoc ***.java .java ...
生成目錄下所有的類的幫助文檔
cd 打開指定目錄耕肩,執(zhí)行命令: javadoc *
jar:打包多個類,生成一個類庫.jar
jar cvf ***.jar 目錄名(文件所在目錄)
二问潭、JRE(Java 運行環(huán)境)
1猿诸、 主要三項功能:
加載代碼
校驗代碼
執(zhí)行代碼
2、類的執(zhí)行過程
前提:類已經(jīng)被編譯
1)加載類:加載器加載類的字節(jié)碼文件
2)校驗類:字節(jié)碼校驗器狡忙,校驗類是否存在非法代碼
3)執(zhí)行類:解釋器解釋執(zhí)行
擴展:編譯性語言與解釋性語言
編譯性語言:先編譯后執(zhí)行
C++梳虽、Java、C#
解釋性語言:不需要編譯直接執(zhí)行
HTML灾茁、JavaScript窜觉、PHP
三是复、創(chuàng)建Java類
注意:命名規(guī)范——類名首字母大寫,若由多個單詞組成竖螃,多個單詞首字母均大寫淑廊。
若要創(chuàng)建的Java類可直接執(zhí)行:
1)類名與Java文件名相同;
2)存在程序入口方法 public static void main(String[] args){......}特咆。
注釋:
// 單行注釋
/* / 多行注釋
/* */ 文檔注釋季惩、多行,javadoc 生成API(Application Interface 應(yīng)用程序接口)幫助文檔腻格,給注釋會寫到幫助文檔中
擴展:Java程序的分類
Java Application Java應(yīng)用程序
Java Applet Java小應(yīng)用程序画拾,制作網(wǎng)頁中的小插件(比如:動畫),已過時
四菜职、數(shù)據(jù)類型
1青抛、基本數(shù)據(jù)類型
數(shù)值型:
整型:byte short int long64位
浮點型:float32位 double 64位
字符型:char,2字節(jié) 可以存儲一個中文漢字
布爾型:boolean
2酬核、引用數(shù)據(jù)類型
數(shù)組
類
接口
3蜜另、數(shù)值的表示方式
二進(jìn)制 0b
八進(jìn)制 0
十進(jìn)制
十六進(jìn)制 0x | 0X
4、數(shù)值后標(biāo)識
長整型 l|L
單精度 f|F
雙精度 d|D
5嫡意、基本數(shù)據(jù)類型的初始值
char nul|0|\u0000
boolean false
整型 0
浮點型 0.0
引用數(shù)據(jù)類型的初始值
null
空字符(nul): 0|\0|\00|\u0000
一举瑰、String類型
是引用類型中“類”類型
String表示一串字符,稱為字符串蔬螟;注意多個字符由一個“”括起來此迅。
轉(zhuǎn)義字符
\ + 字符
常用轉(zhuǎn)義字符
\n
\t
\
"
\d
\f
\0
二、數(shù)據(jù)類型轉(zhuǎn)換
前提:數(shù)據(jù)類型之間兼容旧巾;boolean不能與數(shù)值型耸序、char進(jìn)行類型轉(zhuǎn)換
1、自動數(shù)據(jù)類轉(zhuǎn)換(隱式數(shù)據(jù)類型轉(zhuǎn)換)
目的數(shù)的類型范圍>源數(shù)的類型范圍鲁猩,即轉(zhuǎn)換后數(shù)類型的范圍>轉(zhuǎn)換前的(小向大轉(zhuǎn)換)
float f = 10L; //long型 轉(zhuǎn)換成 float型
byte > short > int > long > float > double
char >
變量間轉(zhuǎn)換:byte或short 與 char不能進(jìn)行自動類型轉(zhuǎn)換
常量值轉(zhuǎn)換給變量:byte或short 與 char 可以進(jìn)行自動類型轉(zhuǎn)換坎怪,注意:不能超出目的類型的取值范圍
2、強制數(shù)據(jù)類型轉(zhuǎn)換(顯示數(shù)據(jù)類型轉(zhuǎn)換)
類型 變量名 = (類型)變量名|值
int i = 100.25; //double型 轉(zhuǎn)換成 int型
三绳匀、變量
可改變的量芋忿,用于數(shù)值可改變的數(shù)據(jù)炸客;
1疾棵、定義的語法規(guī)則:
類型 變量名; //聲明變量痹仙;內(nèi)存中沒有存儲空間
類型 變量名 = 值是尔; //定義變量;內(nèi)存中有存儲空間
2开仰、類型的分類
按數(shù)據(jù)類型劃分:
基本數(shù)據(jù)類型變量
整型變量
字節(jié)型變量
短整型變量
整型變量
長整型變量
浮點型變量
float型變量
double型變量
字符型變量
布爾型變量
引用數(shù)據(jù)類型變量
類型變量 Person類 Person p; Person變量
接口型變量
數(shù)組型變量
按變量所在位置劃分:
成員變量——類中方法外或語句塊外定義的變量
全局變量——類中方法外或語句塊外定義的變量 + static修飾符
局部變量?——方法或語句塊中定義的變量
作用域:
成員變量——作用于整個類
局部變量——作用于一個方法或一個語句塊
注意:先定義拟枚,后使用
三薪铜、運算符
算術(shù)運算符
+ - * /
% 求余數(shù) 3%2 = 1
++ 自增 變量的值+1
前自增 ++i i是一個變量 先自增,再參與運算
后自增 i++ 先參與運算恩溅,再自增
-- 自減 變量的值-1
前自減 --i 先自減隔箍,再參與運算
后自減 i-- 先參與運算,再自減
關(guān)系運算符
> < >= <= == !=
邏輯運算符
true 真 成立
false 假 不成立
! 非 !true false 取反
&& 條件與(邏輯與) true&&false false 兩邊均為真時脚乡,才為真
|| 條件或(邏輯或) true||false true 兩邊均為假時蜒滩,才為假
& 與(按位與) true&&false false 兩邊均為真時,才為真
| 或(按位或) true||false true 兩邊均為假時奶稠,才為假
^(cart)異或 true^true false 兩邊不同時,結(jié)果為真
&&俯艰、|| 與 &、|的區(qū)別锌订?
&&竹握、||是簡潔運算(短路運算),若運算符左邊可以確定結(jié)果辆飘,右邊的表達(dá)式不參與運算
3!=3&&3>2 false 只計算左邊的結(jié)果
3>1&&3<4 true 兩邊均計算
&啦辐、|是非簡潔運算,不管運算符左邊是否可以確定結(jié)果蜈项,右邊均會參與運算
~ &昧甘、|、^是位運算符
<< 左移位
>> 右移位
>>> 無符號右移位
賦值運算符
= += -= *= /= %=
+= 變量 += 表達(dá)式 --》 變量 = 變量 + (表達(dá)式)
字符串連接符
+ 用于連接兩個字符串
條件運算符
? : 變量 = 布爾表達(dá)式 战得? 表達(dá)式1 : 表達(dá)式2
布爾表達(dá)式結(jié)果為true充边,表達(dá)1計算;false常侦,表達(dá)式2計算浇冰。
運算符優(yōu)先級:
!(邏輯非)聋亡、~(按位取反) > 算術(shù)運算符 > 關(guān)系運算符 > 邏輯運算符 > 賦值運算符
按運算符操作數(shù)的數(shù)量進(jìn)行分類:
單目運算符:! ++ -- ~ +(正) -(負(fù))
雙目運算符:
三目運算符:? :
四肘习、表達(dá)式
由操作數(shù)與運算符組成的算術(shù)
3+2*5%4 操作數(shù):3 2 5 4
最簡單表達(dá)式 3 true 'a' i j
一個常量或變量
五、流程控制
1坡倔、順序語句
至上而下漂佩,從第一行到最后一行代碼一次執(zhí)行。
2罪塔、分支語句
根據(jù)一定的條件有選擇地執(zhí)行或跳過特定的語句
if分支語句
if(布爾表達(dá)式) {
}
if(布爾表達(dá)式) {
} else {
}
if(布爾表達(dá)式) {
} else if(布爾表達(dá)式) {
} else if(布爾表達(dá)式) {
} ......
else {
}
switch分支語句
switch(表達(dá)式) {
case 常量:
......
break;
......
default:
......
}
注意表達(dá)式的類型:int(char投蝉、byte、short)征堪、枚舉型(enum)
String(jdk1.7+ 才支持)
case的語句塊中加上break; 否則匹配到語句塊瘩缆,其后case均會執(zhí)行以及default,直到遇到break或整個switch
語句塊執(zhí)行結(jié)束佃蚜。
default:不一定在最后庸娱,可以在任何位置着绊。
3、循環(huán)語句
4熟尉、跳轉(zhuǎn)語句
一归露、循環(huán)語句
在條件滿足的情況下,反復(fù)執(zhí)行一段特定的代碼斤儿。
循環(huán)語句的分類
while
while(布爾表達(dá)式) {
循環(huán)體
}
do..while
do {
循環(huán)體
} while(布爾表達(dá)式);
while與do..while的區(qū)別靶擦?
while —— 先判斷,后執(zhí)行循環(huán)體雇毫;
do..while —— 先執(zhí)行循環(huán)體玄捕,再判斷;do..while確保至少循環(huán)一次棚放,不管條件是否滿足枚粘。
for
for(初值; 布爾表達(dá)式; 迭代值) {
循環(huán)體
}
for循環(huán)的執(zhí)行順序:
1) 初值,初始化語句飘蚯;
2)布爾表達(dá)式馍迄,循環(huán)條件判斷;
3)循環(huán)體局骤,執(zhí)行循環(huán)體
4)迭代值攀圈,修改“循環(huán)條件”中用于條件判斷變量的值,一般是++ --峦甩。
5)回到 2)位置繼續(xù)執(zhí)行
for each 用戶遍歷數(shù)組或集合
for(類型 變量: 數(shù)組|集合變量) {
循環(huán)體
}
二赘来、跳轉(zhuǎn)語句
break語句:結(jié)束當(dāng)前整個循環(huán)
continue語句:結(jié)束當(dāng)前本次循環(huán)
結(jié)合“語句塊標(biāo)記”、跳轉(zhuǎn)語句結(jié)束外層循環(huán)
標(biāo)記一個循環(huán):
標(biāo)識符:for( ; ; ) {
}
三凯傲、數(shù)組
數(shù)組是多個相同類型數(shù)據(jù)的有序組合犬辰。
數(shù)組元素類型是相同的
元素:指定的是數(shù)組這個組合中的一個數(shù)據(jù),這個數(shù)據(jù)稱為數(shù)組元素
數(shù)組是有序的
不是元素值(數(shù)據(jù)的值)有序冰单,元素的位置有序幌缝,這個位置稱為下標(biāo)
可以定義任何類型的數(shù)組,可以定義基本數(shù)據(jù)類型數(shù)組诫欠,可以定義引用類型數(shù)組涵卵。
數(shù)組定義的語法格式:
類型[] 數(shù)組名 = new 類型[數(shù)組長度] 數(shù)組長度——元素個數(shù)
數(shù)組聲明正確的語法格式:
int[] arr;
int [] arr;
int []arr;
int[]arr;
int arr[];
使用new創(chuàng)建數(shù)據(jù)
new 類型[長度];
int[] arr = new int[]; //錯誤,為指定長度
int[] arr = new int[5]; //正確
數(shù)組的初始化
靜態(tài)初始化
類型[] 數(shù)組名 = {值1荒叼,值2, ...., 值n}
動態(tài)初始化
類型[] 數(shù)組名 = new 類型[數(shù)組長度];
注意:每個元素均有相同默認(rèn)值轿偎。
數(shù)組名[下標(biāo)] = 值; //下標(biāo)從0開始 到 長度-1
提取數(shù)組中元素
數(shù)組名[下標(biāo)]甩挫;//獲取數(shù)組中指定下標(biāo)的元素
OOP:面向?qū)ο缶幊?/p>
POP:面向過程編程
一贴硫、類與對象
類:
抽象的、概念上的伊者;是對一類事物的描述英遭。
描述的是多個同類型的對象。
對象:
實際存在的亦渗,存在于計算機的內(nèi)存中(堆中)挖诸;是實際存在的一類事物的單個個體。
類是對象抽象化法精,對象是類的實例化多律。
抽象化:類將一類對象的特征與行為以文字描述。
實例化:根據(jù)類創(chuàng)建一個對象搂蜓。
類包含屬性和方法狼荞、對象包含特征和行為。
二帮碰、類的成員
屬性:
成員變量:
類變量(全局變量):使用static修飾的成員變量相味,就是類變量;類的所有對象共享殉挽。
實例變量:沒有使用static修飾的成員變量丰涉,就是實例變量;對象間是獨立的斯碌。
語法格式:
[權(quán)限修飾符] [修飾符] 類型 變量名 [= 值];
方法:
構(gòu)造方法:
成員方法:
類方法:使用static修飾的成員方法一死;可以使用類名.方法名(參數(shù));
實例方法:沒有使用static修飾的成員方法傻唾;
語法格式:
[權(quán)限修飾符] [修飾符] 返回值類型 方法名([參數(shù)列表]) {
方法體
}
方法中的變量(局部變量)特性:
只有final修飾符投慈;final修飾變量為最終變量,只能為其賦一次值冠骄,第二次賦值時報錯逛裤。
使用前必須初始化。
抽象方法:抽象類才有猴抹;
語句塊
靜態(tài)塊:靜態(tài)語句塊
三带族、對象的創(chuàng)建
類名 對象名 = new 構(gòu)造方法([實參列表]);
訪問對象屬性:
對象名.屬性;
訪問對象方法:
對象名.方法名([實參列表])
形式參數(shù)(形參):方法聲明中的參數(shù)蟀给;
實際參數(shù)(實參):方法調(diào)用時蝙砌,有實際值得參數(shù),參數(shù)的實際值傳遞給形參跋理。
四择克、方法遞歸
方法自身調(diào)用
確定結(jié)束遞歸的條件,否則將發(fā)生“堆棧溢出”異常前普。
OOP:面向?qū)ο缶幊?/p>
POP:面向過程編程
一肚邢、類與對象
類:
抽象的、概念上的;是對一類事物的描述骡湖。
描述的是多個同類型的對象贱纠。
對象:
實際存在的,存在于計算機的內(nèi)存中(堆中)响蕴;是實際存在的一類事物的單個個體谆焊。
類是對象抽象化,對象是類的實例化浦夷。
抽象化:類將一類對象的特征與行為以文字描述辖试。
實例化:根據(jù)類創(chuàng)建一個對象。
類包含屬性和方法劈狐、對象包含特征和行為罐孝。
二、類的成員
屬性:
成員變量:
類變量(全局變量):使用static修飾的成員變量肥缔,就是類變量莲兢;類的所有對象共享。
實例變量:沒有使用static修飾的成員變量辫继,就是實例變量怒见;對象間是獨立的。
語法格式:
[權(quán)限修飾符] [修飾符] 類型 變量名 [= 值];
方法:
構(gòu)造方法:
成員方法:
類方法:使用static修飾的成員方法姑宽;可以使用類名.方法名(參數(shù))遣耍;
實例方法:沒有使用static修飾的成員方法;
語法格式:
[權(quán)限修飾符] [修飾符] 返回值類型 方法名([參數(shù)列表]) {
方法體
}
方法中的變量(局部變量)特性:
只有final修飾符炮车;final修飾變量為最終變量舵变,只能為其賦一次值,第二次賦值時報錯瘦穆。
使用前必須初始化纪隙。
抽象方法:抽象類才有;
語句塊
靜態(tài)塊:靜態(tài)語句塊
三扛或、對象的創(chuàng)建
類名 對象名 = new 構(gòu)造方法([實參列表]);
訪問對象屬性:
對象名.屬性绵咱;
訪問對象方法:
對象名.方法名([實參列表])
形式參數(shù)(形參):方法聲明中的參數(shù);
實際參數(shù)(實參):方法調(diào)用時熙兔,有實際值得參數(shù)悲伶,參數(shù)的實際值傳遞給形參。
四住涉、方法遞歸
方法自身調(diào)用
確定結(jié)束遞歸的條件麸锉,否則將發(fā)生“堆棧溢出”異常。
類與類之間的關(guān)系:
is a 繼承關(guān)系
has a 關(guān)聯(lián)關(guān)系
use a 依賴關(guān)系
A類 B類
A is a B A類是一個B類舆声,即A類繼承B類
class A extends b {} B b = new A();
A has a B A類擁有B類花沉,即A類關(guān)聯(lián)B類
class A {
private B b; //關(guān)聯(lián)關(guān)系
}
A use a B A類使用B類,即A類依賴B類
class A {
public void method() {
B b = new B();
b.method(); //依賴關(guān)系
}
}
一、面向?qū)ο蟮娜筇匦?/p>
1碱屁、封裝性
1)信息隱藏
為什么使用信息隱藏?
用者對類內(nèi)部定義的數(shù)據(jù)(對象的成員變量)的直接操作會導(dǎo)致數(shù)據(jù)的錯誤磷脯、混亂或安全性問題。
什么是信息隱藏忽媒?
類的使用者訪問類争拐,不能訪問類中某個部分腋粥,就可以說晦雨,該部分對使用者信息隱藏;
類的定義者隘冲,定義類時規(guī)定類中某些部分不能被使用者訪問闹瞧,這些部分被信息隱藏。
3) 封裝
使用封裝對信息進(jìn)行隱藏
Java中通過將數(shù)據(jù)(屬性)聲明為私有的(private)展辞,再提供一個或多個公開的(public)方法實現(xiàn)對該屬性的操作
private int age;
public void setAge(int age) {
}
public int getAge() {
}
封裝的作用:
隱藏一個類的實現(xiàn)細(xì)節(jié)奥邮;
使用者只能通過事先定制好的方法來訪問數(shù)據(jù),可以方便地加入控制邏輯罗珍,限制對屬性的不合理操作洽腺;
便于修改,增強代碼的可維護(hù)性覆旱。
2蘸朋、繼承性
子類可以繼承父類中的全部或部分屬性與方法,但不能繼承構(gòu)造方法扣唱。
子類繼承父類藕坯,子類不需要再定義與父類相同的屬性與方法,而是直接使用該屬性和方法噪沙。
父類稱為超類或基類炼彪,子類也稱為派生類
語法格式
[權(quán)限] [修飾符] class 類名 extends 父類名 {
}
類只支持單一繼承,即extends后只能有一個父類名正歼;不支持多重繼承
子類只有一個父類
父類可以派生出多個子類
繼承的實現(xiàn)手段:
派生 —— 創(chuàng)建子類
擴展 —— 子類中添加新屬性與新的方法
繼承作用:
1辐马、代碼的重用;
2、定義共同的協(xié)議(方法)局义。
協(xié)議訪問一個類的接口(訪問類的入口)喜爷,這個接口就是類的方法。
父類引用訪問子類對象的方法旭咽,該方法重寫父類的方法
3贞奋、多態(tài)性
在程序中同一符號或名字在不同情況下具有不同的語義解釋。
一個事物在不同的時候穷绵,具有不同的狀態(tài)轿塔。
編譯時多態(tài)性: 在程序編譯時可確定的多態(tài)性,由重載機制實現(xiàn);
運行時多態(tài)性: 指程序動態(tài)運行時才可確定的多態(tài)性,由繼承結(jié)合動態(tài)綁定實現(xiàn),即由重寫機制來實現(xiàn)勾缭。
繼承 + 動態(tài)綁定
A類揍障,B類 extends A類,C類 extends A類
某個方法中
A a = new B();
a = new C();
上面兩句代碼即動態(tài)綁定俩由。A a = new B(); B類的對象綁定給A類引用毒嫡,注意:B與A存在繼承關(guān)系。
這種給一個引用變量動態(tài)綁定多個不同類型對象幻梯,即為運行時多態(tài)兜畸。
為什么說重寫是運行時多態(tài)?
運行時多態(tài)(不同性)由重寫來實現(xiàn)碘梢;
子類對象賦值給父類的引用變量咬摇,父類引用不能方法到子類擴展屬性和方法、以及被重寫屬性煞躬;只能
訪問自己的屬性和方法肛鹏,這樣就沒有所謂的多態(tài)。但是父類引用可以通過“共同協(xié)議”訪問到子類對
象的重寫方法(重寫父類中方法)恩沛。
共同協(xié)議:父類提供方法讓多個子類重寫在扰,該方法即為共同協(xié)議。
1)重寫
變量重寫:子類中存在與父類相同名稱的變量雷客;
方法重寫:子類中存在與父類相同聲明的方法芒珠。
1)返回值相同、方法名相同佛纫、參數(shù)列表相同妓局;
2)訪問權(quán)限范圍>=父類;
3)子類拋出的異常是父類拋出的異常的子類或本類呈宇。
作用:子類重寫父類變量或方法好爬,子類訪問時所訪問的是子類的變量與方法,父類中相應(yīng)變量與方法被隱藏甥啄。
2)重載
一個類中定義多個方法名相同存炮、參數(shù)列表不相同的方法,就是方法的重載蜈漓。
目的:同類中共享方法名穆桂。
區(qū)分方法是否發(fā)生重載:
唯一判斷方式——參數(shù)列表不相同
參數(shù)個數(shù)不同;
參數(shù)類型不相同融虽。
注意:是否發(fā)生重載與返回值類型無關(guān)享完。
為什么重載是一種多態(tài)性?
同一個方法名有额,訪問到多個不同的方法般又;
編譯時就已經(jīng)確定了要訪問的方法彼绷。
比如:編譯未匹配到方法,將編譯失敗茴迁。
因此重載的多態(tài)性寄悯,體現(xiàn)在編譯時。
重載的多個方法的參數(shù)堕义,存在繼承(is a)關(guān)系:
訪問方法參數(shù)為實際類型(對象的類型)猜旬,匹配參數(shù)為實際類型(對象類型)的方法;
訪問方法參數(shù)是子類類型,重載方法參數(shù)只有父類,匹配參數(shù)為父類的方法倦卖,就近原則洒擦。
訪問方法參數(shù)為形式類型(父類類型指向一個子類類型的對象),匹配參數(shù)為形式類型的方法糖耸。
在父子關(guān)系的重載中秘遏,按照引用類型去找丘薛。
如:
public fun(One one){}
public fun(Two two){}
One one =new Two();
fun(one);//執(zhí)行第一個fun(One one)方法
3)運行時多態(tài)
一個引用類型變量可以指向多種實際類型對象嘉竟,這種現(xiàn)象稱為多態(tài);即形式類型與實際類型就是多態(tài)洋侨。
對象在運行時才會創(chuàng)建
這種情況在運行時才能確定舍扰,所以是運行時多態(tài)。
Animal animal;
animal = new Dog();
animal = new Cat();
通過聲明為父類型的對象引用來引用他的子類型對象
希坚。
在繼承的關(guān)系中體現(xiàn)多態(tài):一個對象變量的引用可以指向多種實際類型的對象边苹。(實際類型和形式類型不同);
父類引用可以指向多個子類裁僧。
當(dāng)一個父類的引用指向一個子類的實例時个束,子類自有的屬性或者方法不可見(自有屬性:包括和父類同名的變量);
而同名方法聊疲,因為有重寫茬底,所以對于重寫的方法來說,可以調(diào)用获洲;
但同名而不是重寫(如:重載)阱表,則不能調(diào)用
。
二贡珊、實例變量與局部變量
實例變量:類中方法外定義的變量最爬,且沒有使用static修飾。
局部變量:方法中定義的變量门岔。
局部變量使用前菱皆,需要先賦初值。
變量之間的比較
== —— 基本數(shù)據(jù)類型與引用數(shù)據(jù)類型用“==”比較
equals —— 常用于比較字符串
三咖摹、對象轉(zhuǎn)型
對象轉(zhuǎn)型分為上轉(zhuǎn)型與下轉(zhuǎn)型蜓洪,屬于運行時多態(tài)胯努。
上轉(zhuǎn)型(上溯轉(zhuǎn)型)—— 子類引用類型上溯轉(zhuǎn)型成父類引用類型
自動類型轉(zhuǎn)換
父類類型 變量名 = new 子類構(gòu)造方法(參數(shù)列表);
或
子類類型 子類變量名 = new 子類構(gòu)造方法(參數(shù)列表);
父類類型 變量名 = 子類變量名;
下轉(zhuǎn)型(下溯轉(zhuǎn)型逢防、造型)—— 父類引用類型下溯轉(zhuǎn)型成子類引用類型
強制類型轉(zhuǎn)換
子類類型 變量名 = (子類類型) 父類變量;
引用類型間轉(zhuǎn)換叶沛,遵守規(guī)則:
1)類型間兼容:存在繼承關(guān)系;
2)下轉(zhuǎn)型時忘朝,不能直接將父類對象轉(zhuǎn)型成子類引用類型灰署;需要:
先將子類轉(zhuǎn)型成父類,才可以將父類轉(zhuǎn)型回子類局嘁,即溉箕,先上后下(下轉(zhuǎn)型前,必須先經(jīng)過上轉(zhuǎn)型)悦昵。
關(guān)鍵字:instanceOf
語言格式:
引用變量名 instanceof 類名肴茄;//返回值true|false
用于檢查一個對象是否是某個類的實例。
注意:父類但指、間接父類檢查的結(jié)果也為true寡痰。
四、Object類
Object類是所有Java類的根父類棋凳,任何一個Java類直接或間接繼承Object類拦坠。
如果在類的聲明中未使用extends關(guān)鍵字指明其父類,則默認(rèn)父類為Object類剩岳。
五贞滨、構(gòu)造器
類中的構(gòu)造方法(構(gòu)造函數(shù))。
構(gòu)造方法用于創(chuàng)建拍棕、初始化對象
對象的創(chuàng)建:new 構(gòu)造方法名();
語法格式:
[訪問權(quán)限] 類名(參數(shù)列表) {
語句塊; //一般做初始化操作
}
特點:
1)沒有返回值類型晓铆;
2)方法名與類名相同;
3)構(gòu)造方法可以重載绰播;
4)任何類都有構(gòu)造方法骄噪,若沒有顯示定義構(gòu)造方法,類默認(rèn)存在一個公共的無參的構(gòu)造方法幅垮;
若顯示定義構(gòu)造方法腰池,默認(rèn)構(gòu)造方法不再存在,被替代忙芒。
思考:
繼承關(guān)系(is a)示弓,創(chuàng)建子類對象時,子類與父類的構(gòu)造方法的執(zhí)行情況如何呵萨?
A奏属、只有子類構(gòu)造方法執(zhí)行
B、先父類構(gòu)造方法執(zhí)行潮峦,再子類構(gòu)造方法執(zhí)行
C囱皿、先子類構(gòu)造方法執(zhí)行勇婴,再父類構(gòu)造方法執(zhí)行
答案:B
默認(rèn)情況下:先執(zhí)行父類無參構(gòu)造方法,再執(zhí)行子類構(gòu)造方法嘱腥。
六耕渴、關(guān)鍵字:this、super
this:
指向當(dāng)前對象齿兔,相當(dāng)于當(dāng)前對象的引用橱脸。所有引用就是對象變量,指向一個對象分苇。
this關(guān)鍵字用于構(gòu)造方法添诉、實例方法;類方法不能使用医寿。
this.成員變量 —— 訪問當(dāng)前對象的實例變量栏赴、類變量
this.成員方法 —— 訪問當(dāng)前對象的實例方法、類方法
this(參數(shù)列表) —— 訪問其他構(gòu)造方法靖秩,只能是構(gòu)造方法中的第一行代碼
super:
指向?qū)ο蟮母割?
super關(guān)鍵字用于構(gòu)造方法须眷、實例方法;類方法不能使用盆偿。
super.成員變量 —— 訪問父類的實例變量柒爸、類變量
super.成員方法 —— 訪問父類的實例方法、類方法
super(參數(shù)列表) —— 訪問父類構(gòu)造方法事扭,只能是構(gòu)造方法中的第一行代碼
七、實例變量乐横、類變量求橄,實例方法、類方法
1葡公、實例變量與類變量的:
1)定義:
類變量使用static修飾符修飾罐农;
實例變量沒有使用static修飾符修飾。
2)不同類訪問:
訪問類變量催什,類名.類變量名涵亏、對象名.類變量名;
訪問實例變量蒲凶,對象名.實例變量名气筋。
3)數(shù)據(jù)共享:
類變量,又稱靜態(tài)變量旋圆,數(shù)據(jù)是多個對象共享的宠默;
實例變量,對象之間相對獨立的灵巧,即非共享的搀矫。
2抹沪、實例方法與類放方法的區(qū)別:
1)定義:
類方法使用static修飾符修飾;
實例方法沒有使用static修飾符修飾瓤球。
2)不同類訪問:
訪問類方法融欧,類名.類方法(參數(shù)列表)、對象名.類方法(參數(shù)列表)卦羡;
訪問實例方法蹬癌,對象名.實例方法(參數(shù)列表)。
3) 同類中訪問:
類方法中虹茶,只能直接訪問類變量逝薪、類方法;
若一定要訪問實例變量蝴罪、實例方法董济,可以使用對象名.實例變量、對象名.實例方法(參數(shù)列表)形式方法要门。
實例方法中虏肾,可以直接訪問類變量、類方法欢搜、實例變量封豪、實例方法。
一炒瘟、類之間的關(guān)聯(lián)關(guān)系
關(guān)聯(lián)關(guān)系分類:
A has a B A類關(guān)聯(lián)B類
A: 關(guān)聯(lián)類
B: 被關(guān)聯(lián)類
組合:
關(guān)聯(lián)類的對象與被關(guān)聯(lián)類的對象生命周期相同吹埠;
同時創(chuàng)建且同時銷毀。
聚合:
關(guān)聯(lián)類的對象與被關(guān)聯(lián)類的對象生命周期相同疮装;
A對象先于B對象創(chuàng)建
B對象先于A對象創(chuàng)建
A對象先于B對象銷毀
B對象先于A對象銷毀
組合的關(guān)聯(lián)性強度 > 聚合
二缘琅、抽象類
用abstract修飾符修飾的類就是抽象類,抽象類不能被實例化廓推。
1刷袍、抽象方法:使用abstract修飾符修飾的方法就是抽象方法
1)抽象方法只有方法的聲明,沒有方法體樊展;
2)抽象類的子類呻纹,需要重寫父類抽象方法,否則子類仍是抽象類专缠。
2雷酪、抽象類的成員
成員變量:
類變量
實例變量
靜態(tài)塊
語句塊
構(gòu)造方法
成員方法:
類方法
實例方法
抽象方法
3、抽象類中不一定存在抽象方法藤肢,存在抽象方法的類一定是抽象類太闺。
4、abstract修飾符不能與private嘁圈、final省骂、static修飾符共用蟀淮。
修飾方法
private:子類沒有訪問方法的權(quán)限,沒有訪問權(quán)限就不能重寫钞澳;
final:最終方法怠惶,不能被子類重寫;
private轧粟、final與abstract沖突策治。
static:static修飾得方法(類方法),子類重寫父類類方法兰吟,形式上重寫通惫,實際上沒有重寫;
子類對象賦值父類引用混蔼,父類引用訪問類方法時履腋,訪問的是父類的類方法。
@Override驗證是否重寫惭嚣,不通過遵湖。
三、接口
接口是抽象方法和常量值的定義的集合晚吞。
1延旧、接口中的成員
常量
抽象方法
//jdk 1.8+
靜態(tài)方法 static修飾
接口名.方法名(參數(shù)列表); //訪問接口的靜態(tài)方法
默認(rèn)方法 default修飾
實現(xiàn)類繼承接口的默認(rèn)方法
2、接口的特性
1槽地、接口支持多重繼承迁沫;
2、接口是一種特殊的抽象類闷盔,定義接口時不用abstract修飾符弯洗,也可以用abstract修飾;
3逢勾、接口默認(rèn)是(只能是) public abstract,對所有包可見藐吮,不能被實例化溺拱;
4、接口的變量默認(rèn)是(只能是)public static final谣辞,對所有包中的類可見迫摔,共享的,最終的泥从,將其視為“常量”句占。
5、接口的方法默認(rèn)是(只能是) public abstract躯嫉,沒有方法體纱烘,不能使用private杨拐、protected、final擂啥、static
native哄陶、synchronized修飾符
3、實現(xiàn)接口 implements
語法格式:
[修飾符] class 類名 [extends 父類] implements 接口名1[,接口名2][,接口名...][,接口名N] {
類體
}
一個類可以同時實現(xiàn)多個接口哺壶。
4屋吨、接口可以繼承接口,甚至可以同時繼承多個接口
語法格式:
[修飾符] interface 接口名 extends 父接口名1[,父接口名2][,父接口名...][,父接口名N] {
接口體
}
接口支持多重繼承山宾。
四至扰、序列化 Serializable
1、Serializable是一個接口资锰,并非關(guān)鍵字敢课;
2、Serializable接口比較特殊又被稱做marker,因為它沒有任何方法要被實現(xiàn)台妆;
3翎猛、
它的作用:在于實現(xiàn)它的類可以被序列化。
序列化的作用:
1)使對象可以在網(wǎng)絡(luò)上傳輸接剩;
2)
可以使對象寫到文件中切厘。
注意:對象若要在網(wǎng)絡(luò)上傳輸或持久化到文件中,該必須是可序列化Serializable接口懊缺。
一般要序列化的對象都是VO(Value Object)值對象疫稿,成員:實例變量、構(gòu)造方法鹃两、Setter+Getter方法遗座。
五、內(nèi)部類
一個類內(nèi)部定義的類俊扳,稱為內(nèi)部類途蒋。
1、內(nèi)部類與外層封裝它的類之間存在邏輯的所屬關(guān)系馋记。
編譯后內(nèi)部類會單獨生產(chǎn)一個字節(jié)碼文件(外層類名$內(nèi)部類名.class)号坡;
物理上,外層類與內(nèi)部類不在一個字節(jié)碼文件中梯醒。
2宽堆、內(nèi)部類一般用在定義它的類或語句塊之內(nèi)。
3茸习、內(nèi)部類的類名不能包含它的外層類名相同畜隶。
4、內(nèi)部類可以使用包含它的類的靜態(tài)和實例成員變量,也可以使用它所在方法的局部變量籽慢;
內(nèi)部類能夠訪問創(chuàng)建它 的對象的實現(xiàn),包括私有成員浸遗;
內(nèi)部類能夠隱藏起來(private),不為其他類所見。
5嗡综、內(nèi)部類的分類:
1)普通內(nèi)部類
2)方法本地內(nèi)部類
3)靜態(tài)內(nèi)部類
4)匿名類
沒有名字的類乙帮,當(dāng)類只會創(chuàng)建一個對象,以后不再用到這個類极景,就考慮使用匿名類察净。
思考:
1、抽象類與接口的區(qū)別:
抽象類 接口
繼承:
只支持單一繼承 支持多重繼承
定義:
abstract class 類名 { } interface 接口名{ } 默認(rèn)是public abstract
使用:
子類名 extends 抽象類名 { } 實現(xiàn)類名 implements 接口名1[,接口名2...][,接口N]
內(nèi)部成員:
普通類的成員:成員變量盼樟、成員方法..., 常量氢卡、抽象方法
抽象方法 jdk1.8+ 版本中,靜態(tài)方法晨缴、默認(rèn)方法
特性:
抽象類中方法可以是public译秦、protected、 只有public訪問權(quán)限
default訪問權(quán)限
定義抽象類使用abstract修飾符 接口省略了abstract修飾符
一击碗、字符串String類
字符串指的是字符序列
Java中并沒有內(nèi)置的字符串類型(沒有基本類型)筑悴,而是在標(biāo)準(zhǔn)Java庫中包含一個String類。
字符串是一種簡單而且常用的數(shù)據(jù)結(jié)構(gòu)稍途。
1阁吝、String類
String表示一個字符串,字符串是常量械拍,一旦創(chuàng)建就不能修改;
String是被final修飾的突勇,最終類,所以String不能被繼承坷虑;
String調(diào)用方法修改內(nèi)容的時候甲馋,如果內(nèi)容不會改變,就直接返回原來的String對象,
如果有改變會產(chǎn)生新對象迄损;
String如果用+運算定躏,標(biāo)示字符串的連接運算,字符串的連接運算會產(chǎn)生大量新對象芹敌,消耗內(nèi)存共屈;
如果有頻繁的做字符串連接,建議用StringBuffer或者StringBuilder
党窜。
2、創(chuàng)建字符串借宵,即定義字符串變量
1)字符串常量賦值給字符串變量
String str = "abc";
"abc"常量幌衣,是一個字符串對象,在內(nèi)存的常量池中
2) 字符串對象賦值給字符串變量
String str = new String("abc");
new String("abc")創(chuàng)建一個字符串對象,在內(nèi)存的堆中
a)檢查常量池中是否存在"abc"字符串對象豁护,若不存在創(chuàng)建一個字符串對象(常量池中)哼凯,若存在就不創(chuàng)建,
使用已存在的字符串對象楚里;
b)堆中新建一個字符串對象断部,并將字符常量的值(字符數(shù)組)賦值給該對象。
3)字符串方法班缎,詳細(xì)查看API
作業(yè):
1蝴光、解析字符串?dāng)?shù)據(jù),封裝成一個對象
創(chuàng)建方法splitData(String data)达址,解析字符串蔑祟,字符串方法調(diào)用時傳遞;
創(chuàng)建VO類Student沉唠,封裝的對象
比如:傳過來的參數(shù)是"name=zhangsan;number=3;score=123"
把里面所有的東西分離出來疆虚,
然后封裝成一個student的實例
2、設(shè)計程序?qū)Α懊艽a”字符進(jìn)行加密
算法:大寫字母或小寫字母或數(shù)組首尾交換满葛。
'A' + 25 --> 'Z'
'A'+('A'-'B'+25) --> 'Y'
3径簿、設(shè)計程序過濾“不文明”詞匯
要求:詞匯有n個字符就有n個*。
一嘀韧、StringBuffer類 可變字符串篇亭、緩沖字符串
用final修飾的,不能繼承
線程安全的可變字符序列乳蛾。
一個類似于 String 的字符串緩沖區(qū)(char數(shù)組暗赶,默認(rèn)16個字符)。
用stringBuffer來做字符串的處理肃叶,不會產(chǎn)生大量的新對象蹂随,對內(nèi)存消耗小,提高了效率因惭。
每個字符串緩沖區(qū)都有一定的容量岳锁。只要字符串緩沖區(qū)所包含的字符序列的長度沒有超出此容量,就無需分配新的內(nèi)部緩
沖區(qū)數(shù)組蹦魔。如果內(nèi)部緩沖區(qū)溢出激率,則此容量自動增大(一倍)。
重要的方法: append方法勿决,insert方法乒躺,delete方法,length方法低缩,toString方法嘉冒。
String與StringBuffer的區(qū)別:
String 不可變得字符串
修改字符串的值會產(chǎn)出一個新的字符串對象曹货;
頻繁修改字符串,產(chǎn)生大量的字符串對象讳推,占用大量的內(nèi)存空間顶籽。
用一個最終的字符數(shù)組(char[])來存放字符,字符數(shù)組變量不能再次賦值银觅;
字符串相加礼饱,字符串長度增加,字符數(shù)組長度也增加究驴;
但是數(shù)組長度定義時就確定镊绪,不能改變,只能創(chuàng)建新的數(shù)組(長度=字符串長度)纳胧,再重新賦給字符數(shù)組變量镰吆;
字符數(shù)組變量不能再次賦值,所以只能創(chuàng)建一個新的String對象跑慕。
StringBuffer 可變的字符串
修改字符串的值不會產(chǎn)生新的字符串對象万皿;
頻繁修改字符串,不會產(chǎn)生新的字符串對象核行,節(jié)省了內(nèi)存空間牢硅。
用一個可變字符緩沖數(shù)組存放字符,不是最終的芝雪,字符數(shù)組變量可以再次賦值减余;
字符數(shù)組有默認(rèn)容量(默認(rèn)長度:16);
字符串相加惩系,長度未超過容量(<=容量)位岔,容量不改變,即不會新的字符串?dāng)?shù)組堡牡;
字符串相加抒抬,長度超出容量,容量自動增加一倍( (容量+1)*2 )晤柄;創(chuàng)建長度是原來一倍的新數(shù)組擦剑,再賦值給
字符數(shù)組變量。
StringBuilder類
一個可變的字符序列芥颈。此類提供一個與 StringBuffer 兼容的 API惠勒,但不保證同步(不保證線程安全)
StringBuffer與StringBuilder的區(qū)別:
StringBuffer是線程安全的,運行效率較慢爬坑。
StringBuilder是線程非安全的纠屋,運行效率較快。
二盾计、==操作符與equals()方法
1巾遭、==用于比較引用數(shù)據(jù)類與基本數(shù)據(jù)類型肉康,equals比較引用數(shù)據(jù)類型;
2灼舍、兩者均可比較引用數(shù)據(jù)類
== 比較的是對象在棧中的引用;
equals()方法默認(rèn)情況下涨薪,比較的是對象在棧中的引用骑素;
equals()方法是類從Object類繼承的,即可以重新equals()方法刚夺,使其按對象的值比較献丑;
比如:String類重新equals()方法,使字符串對象按值比較侠姑。
三创橄、Object類中的方法
equals()方法
hashcode()方法
getClass()方法
toString()方法
四、Wrapper類(封裝類)
用于封裝基本數(shù)據(jù)類型的類莽红,即基本數(shù)據(jù)類型以類的形式體現(xiàn)妥畏。
1.4- 手動裝箱與拆箱
裝箱
Integer inte = new Interger(10);
拆箱
int i = inte.intValue;
1.5+ 自動裝箱與拆箱
裝箱
Integer inte = 10;
拆箱
int i = inte;
八大基本數(shù)據(jù)類,擁有八個封裝類
Byte
Short
Integer
Long
Float
Double
Boolean
Character
常用封裝類進(jìn)行:基本數(shù)據(jù)類型與字符串進(jìn)轉(zhuǎn)換安吁。
五醉蚁、Math類
Math類包含用于執(zhí)行基本數(shù)學(xué)運算的方法,如初等指數(shù)鬼店、對數(shù)网棍、平方根和三角函數(shù)。
ceil(double a) //返回大于等于并最接近參數(shù)的整數(shù)
floor(double a) //返回小于等于并最接近參數(shù)的整數(shù)
round(double a) //返回最接近參數(shù)的整數(shù)妇智,四舍五入
max(double a, double b) //返回兩個參數(shù)中最大值
min(double a, double b) //返回兩個參數(shù)中最小值
abs(double a) //返回絕對值
pow(double a, double b) //返回第一個參數(shù)的第二個參數(shù)次冪的值滥玷,即a的b次方
random() //返回隨機數(shù),該值大于等于 0.0 且小于 1.0
六巍棱、Class類
Class類的實例表示正在運行的 Java 應(yīng)用程序中的類和接口惑畴。
一個類(A類)第一個對象創(chuàng)建時,JVM自動加載這個類拉盾,生成該類一個Class類型的對象桨菜,這個對象封裝該類(A類)的基本
信息,比如:類名捉偏、屬性名倒得、屬性的類型、訪問權(quán)限夭禽、方法名霞掺、返回值類型、方法訪問權(quán)限等讹躯。
即Class類的對象用于封裝一個類的基本信息菩彬。
常用于反射機制缠劝。
七、單例模式
一個類只有一個實例骗灶,而且自行實例化并向整個系統(tǒng)提供這個實例惨恭。
一個類在一個系統(tǒng)執(zhí)行過程中只有一個對象。
實現(xiàn)單例模式遵守三大原則:
1)定義一個私有的耙旦、靜態(tài)的脱羡、本類類型的變量;
2)定義一個私有的構(gòu)造方法免都;
3)定義一個公共的锉罐、靜態(tài)的、返回本類類型的方法绕娘。
class Singleton{
private static final Singleton st=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return st;
}
}
單例模式分類:
餓漢模式
飽漢模式脓规、懶漢模式
八、Random類
隨機數(shù)生成器
nextInt()
nextInt(int n) //n是數(shù)的范圍 0...n(不包括)
九险领、UUID類
UUID 表示一個 128 位的值侨舆,隨機的、16進(jìn)制
常用UUID生成32位16進(jìn)制數(shù)值得隨機字符串(+ 4個短直線分隔)舷暮;此類字符串一般用于做ID态罪。
UUID.randomUUID().toString();
十、Date類
時間類——類 Date 表示特定的瞬間下面,精確到毫秒(ms)
構(gòu)造方法
Date(); //獲得當(dāng)前時間對象
Date(long date); //獲得指定時間的時間對象复颈,根據(jù)date(距1970-1-1 00:00:00:000毫秒數(shù))進(jìn)行計算
擴展:DateFormat、SimpleDateFormat類格式化時間
常用方法
getTime() //當(dāng)前時間 距 距1970-1-1 00:00:00的毫秒數(shù)
十一沥割、Calendar類
日歷類
常用方法
getInstance(); //獲得日歷對象
set(int year, int month, int day, ...); //設(shè)置日期
getTime(); //獲得日歷上當(dāng)前日期
get(int field); //獲取日歷上當(dāng)前日期的指定字段值(年耗啦、月、日机杜、時...)
set(int field, int value); //給日歷上日期的某個字段設(shè)值
roll(int field, int amount); //向指定日歷字段添加指定(有符號的)時間量
十二帜讲、對象的銷毀
1、局部變量如何銷毀
局部變量是方法中變量椒拗,生命周期就是方法的執(zhí)行的一個過程似将;
方法執(zhí)行結(jié)束,局部變量會被立即從棧中銷毀蚀苛。
2在验、實例變量如何銷毀
實例變量存在對象中,依附于對象存在堵未,對象在腋舌,實例變量就存在;
對象銷毀時渗蟹,實例變量就會被銷毀块饺。
3赞辩、對象如何銷毀
若一個對象成為無用對象(在棧中沒有對該對象的引用、沒有其他對象對該對象的引用)授艰,就會被銷毀辨嗽;
不是馬上銷毀,而是下一次資源回收時銷毀想诅。
4召庞、資源回收機制
1、系統(tǒng)(JVM)自動調(diào)用来破,周期性;
2忘古、程序員無法干預(yù)徘禁,比如:干預(yù)如何回收、回收那些東西髓堪。
3送朱、System.gc(); //運行垃圾回收器,進(jìn)行一次資源回收
4干旁、finalize(); //一個對象被銷毀時驶沼,自動調(diào)用該方法,一般用于進(jìn)行資源清理操作