Java

# Java ## 常量 ### 常量概述 常量:是指在Java程序中固定不變的數(shù)據(jù)。 ### 常量分類 | 常量類型 | 含義 | 數(shù)據(jù)舉例 | | ---------- | -------------------------------------- | ---------------------- | | 整數(shù)常量 | 所有的整數(shù) | 0,1柒竞,520沙咏,982674 | | 小數(shù)常量 | 所有的小數(shù) | 0.1峭跳,-0.3,3.141592653 | | 字符常量 | 單引號(hào)包含恒水,只能寫一個(gè)字符咒劲,必須有內(nèi)容 | 'a','中','國(guó)' | | 字符串常量 | 雙引號(hào)包含顷蟆,可以寫多個(gè)字符,也可以不寫 | "AAA","charles","" | | 布爾常量 | 只有兩個(gè)值缎患,非true即false | true,false | | 空常量 | 只有一個(gè)值 null | null | ### 案例 輸出各種類型的常量: ```java public class ConstantDemo { public static void main(String[] args){ //輸出整數(shù)常量 System.out.println(123); //輸出小數(shù)常量 System.out.println(0.125); //輸出字符常量 System.out.println('A'); //輸出布爾常量 System.out.println(true); //輸出字符串常量 System.out.println("你好Java"); } } ``` ## 變量和數(shù)據(jù)類型 ### 變量概述 變量:常量是固定不變的數(shù)據(jù)慕的,那么在程序中可以變化的量稱為變量。 > Java中要求一個(gè)變量每次只能保存一個(gè)數(shù)據(jù)挤渔,必須要明確保存的數(shù)據(jù)類型肮街。 ### 常量和變量的運(yùn)算 下面的程序有問(wèn)題嗎? ```java public static void main(String[] args){ byte b1=1; byte b2=2; byte b3=1 + 2; byte b4=b1 + b2; System.out.println(b3); System.out.println(b4); } ``` 分析: b3 = 1 + 2 判导, 1 和 2 是常量嫉父,為固定不變的數(shù)據(jù),在編譯的時(shí)候(編譯器javac)眼刃,已經(jīng)確定了 1+2 的結(jié)果并沒(méi) 有超過(guò)byte類型的取值范圍绕辖,可以賦值給變量 b3 ,因此 b3=1 + 2 是正確的擂红。 反之仪际, b4 = b2 + b3 , b2 和 b3 是變量,變量的值是可能變化的树碱,在編譯的時(shí)候肯适,編譯器javac不確定b2+b3的結(jié)果是什 么,因此會(huì)將結(jié)果以int類型進(jìn)行處理成榜,所以int類型不能賦值給byte類型框舔,因此編譯失敗。 ### 數(shù)據(jù)類型 #### 數(shù)據(jù)類型分類 Java的數(shù)據(jù)類型分為兩大類: > - **基本數(shù)據(jù)類型**:包括 `整數(shù)` 赎婚、 `浮點(diǎn)數(shù)` 刘绣、 `字符` 、 `布爾` 挣输。 > > - **引用數(shù)據(jù)類型**:包括 `字符串`纬凤、 `類` 、 `數(shù)組` 撩嚼、 `接口` 移斩。 > #### 數(shù)據(jù)類型的默認(rèn)值 - 基本數(shù)據(jù)類型 | 數(shù)據(jù)類型 | 默認(rèn)值 | | ------------------------------ | -------- | | 整數(shù)(byte,short绢馍,int,long) | 0 | | 浮點(diǎn)數(shù)(float肠套,double) | 0.0 | | 字符(char) | '\u0000' | | 數(shù)組舰涌,類,接口 | false | - 引用數(shù)據(jù)類型 | 數(shù)據(jù)類型 | 默認(rèn)值 | | -------------- | ------ | | 數(shù)組你稚,類瓷耙,接口 | null | #### 基本數(shù)據(jù)類型 四類八種基本數(shù)據(jù)類型: | 數(shù)據(jù)類型 | 關(guān)鍵字 | 內(nèi)存占用(字節(jié)) | 取值范圍 | | ------------ | ------------ | ---------------- | --------------------- | | 字節(jié)型 | byte | 1 | -128~127 | | 短整型 | short | 2 | -32768~32767 | | 整型 | int(默認(rèn)) | 4 | -2^31~2^31 -1 | | 長(zhǎng)整型 | long | 8 | -2^63~2^63 -1 | | 單精度浮點(diǎn)數(shù) | float | 4 | 1.4013E-45~3.4028E+38 | | 雙精度浮點(diǎn)數(shù) | double(默認(rèn)) | 8 | 4.9E-324~1.7977E+308 | | 字符型 | char | 2 | 0-65535 | | 布爾型 | boolean | 1 | true,false | #### 引用數(shù)據(jù)類型 ### 變量的定義 #### 格式 ``` 數(shù)據(jù)類型 變量名 = 數(shù)據(jù)值; ``` #### 案例 定義所有基本數(shù)據(jù)類型的變量刁赖,代碼如下: ```java public class Variable { public static void main(String[] args){ //定義字節(jié)型變量 byte b = 100; System.out.println(b); //定義短整型變量 short s = 1000; System.out.println(s); //定義整型變量 int i = 123456; System.out.println(i); //定義長(zhǎng)整型變量 long l = 12345678900L; System.out.println(l); //定義單精度浮點(diǎn)型變量 float f = 5.5F; System.out.println(f); //定義雙精度浮點(diǎn)型變量 double d = 8.5; System.out.println(d); //定義布爾型變量 boolean bool = false; System.out.println(bool); //定義字符型變量 char c = 'A'; System.out.println(c); } } ``` ## 數(shù)據(jù)類型轉(zhuǎn)換 ### 隱式轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換) **自動(dòng)轉(zhuǎn)換**:將 `取值范圍小的類型` 自動(dòng)提升為 `取值范圍大的類型` 搁痛。 #### 轉(zhuǎn)換規(guī)則: 范圍小的類型向范圍大的類型提升, `byte`宇弛、`short`鸡典、`char` 運(yùn)算時(shí)直接提升為 `int` 。 > byte枪芒、short彻况、char‐‐>int‐‐>long‐‐>float‐‐>double #### 案例: 一個(gè) `int` 類型變量和一個(gè) `byte` 類型變量進(jìn)行加法運(yùn)算, 結(jié)果會(huì)是什么數(shù)據(jù)類型舅踪? ```java public static void main(String[] args) { int i = 1; byte b = 2; // byte x = b + i; // 報(bào)錯(cuò) //int類型和byte類型運(yùn)算纽甘,結(jié)果是int類型 int j = b + i; System.out.println(j); } ``` 運(yùn)算結(jié)果,變量的類型將是 `int` 類型抽碌,這就是出現(xiàn)了數(shù)據(jù)類型的自動(dòng)類型轉(zhuǎn)換現(xiàn)象悍赢。 ### 顯式轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換) **強(qiáng)制類型轉(zhuǎn)換:**將 `取值范圍大的類型` 強(qiáng)制轉(zhuǎn)換成 `取值范圍小的類型` 。 比較而言,自動(dòng)轉(zhuǎn)換是Java自動(dòng)執(zhí)行的左权,而強(qiáng)制轉(zhuǎn)換需要我們自己手動(dòng)執(zhí)行皮胡。 #### 轉(zhuǎn)換格式: > 數(shù)據(jù)類型 變量名 = (數(shù)據(jù)類型)被轉(zhuǎn)數(shù)據(jù)值; #### 案例: 當(dāng)一個(gè) `short` 類型與 1 相加涮总,我們知道會(huì)類型提升胸囱,但是還想給結(jié)果賦值給short類型變量,就需要強(qiáng)制轉(zhuǎn)換瀑梗。 ```java public static void main(String[] args) { //short類型變量烹笔,內(nèi)存中2個(gè)字節(jié) short s = 1; /* 出現(xiàn)編譯失敗 s和1做運(yùn)算的時(shí)候,1是int類型抛丽,s會(huì)被提升為int類型 s+1后的結(jié)果是int類型谤职,將結(jié)果在賦值會(huì)short類型時(shí)發(fā)生錯(cuò)誤 short內(nèi)存2個(gè)字節(jié),int類型4個(gè)字節(jié) 必須將int強(qiáng)制轉(zhuǎn)成short才能完成賦值 */ s = s + 1亿鲜;//編譯失敗 s = (short)(s+1);//編譯成功 } ``` #### 特別注意: - 浮點(diǎn)轉(zhuǎn)成整數(shù)允蜈,直接取消小數(shù)點(diǎn),可能造成數(shù)據(jù)損失精度蒿柳。 - int 強(qiáng)制轉(zhuǎn)成 short 砍掉2個(gè)字節(jié)饶套,可能造成數(shù)據(jù)丟失。 ### ASCII編碼表 **編碼表 :**就是將人類的文字和一個(gè)十進(jìn)制數(shù)進(jìn)行對(duì)應(yīng)起來(lái)組成一張表格垒探。 #### 需熟記的部分: | 字符 | 數(shù)值 | | :--: | :--: | | 0 | 48 | | 9 | 57 | | A | 65 | | Z | 90 | | a | 97 | | z | 122 | #### 特別注意: > 在char類型和int類型計(jì)算的過(guò)程中妓蛮,char類型的字符先查詢編碼表,得到97圾叼,再和1求和蛤克,結(jié)果為98。char類型提升 為了int類型夷蚊。char類型內(nèi)存2個(gè)字節(jié)构挤,int類型內(nèi)存4個(gè)字節(jié)。 ## 運(yùn)算符 ### 算術(shù)運(yùn)算符 | 符號(hào) | 意義 | | ------ | ---------------------------- | | + | 加法運(yùn)算惕鼓,字符串連接運(yùn)算 | | - | 減法運(yùn)算 | | * | 乘法運(yùn)算 | | / | 除法運(yùn)算 | | % | 取模運(yùn)算筋现,兩個(gè)數(shù)字相除取余數(shù) | | ++、-- | 自增自減運(yùn)算 | #### 自增自減混合運(yùn)算: - 和其他變量放在一起箱歧, 前++ 和 后++ 就產(chǎn)生了不同夫否。 變量 前++ :變量a自己加1,將加1后的結(jié)果賦值給b叫胁,也就是說(shuō)a先計(jì)算凰慈。a和b的結(jié)果都是2。 ```java public static void main(String[] args) { int a = 1; int b = ++a; System.out.println(a);//計(jì)算結(jié)果是2 System.out.println(b);//計(jì)算結(jié)果是2 } ``` 變量 后++ :變量a先把自己的值1驼鹅,賦值給變量b微谓,此時(shí)變量b的值就是1森篷,變量a自己再加1。a的結(jié)果是2豺型,b 的結(jié)果是1仲智。 ```java public static void main(String[] args) { int a = 1; int b = a++; System.out.println(a);//計(jì)算結(jié)果是2 System.out.println(b);//計(jì)算結(jié)果是1 } ``` ### 賦值運(yùn)算符 | 符號(hào) | 意義 | | :--- | -------- | | = | 等于 | | += | 加等于 | | -= | 減等于 | | *= | 乘等于 | | /= | 除等于 | | %= | 取模等于 | #### +=符號(hào)的擴(kuò)展 下面的程序有問(wèn)題嗎? ```java public static void main(String[] args){ short s = 1; s+=1; System.out.println(s); } ``` 分析: s += 1 邏輯上看作是 s = s + 1 計(jì)算結(jié)果被提升為int類型姻氨,再向short類型賦值時(shí)發(fā)生錯(cuò)誤钓辆,因?yàn)椴荒軐⑷≈捣秶?大的類型賦值到取值范圍小的類型。但是肴焊, s=s+1進(jìn)行兩次運(yùn)算 前联, += 是一個(gè)運(yùn)算符,只運(yùn)算一次娶眷,并帶有強(qiáng)制轉(zhuǎn)換的特點(diǎn)似嗤, 也就是說(shuō) s += 1 就是 s = (short)(s + 1) ,因此程序沒(méi)有問(wèn)題編譯通過(guò)届宠,運(yùn)行結(jié)果是2. ### 比較運(yùn)算符 | 符號(hào) | 意義 | | ---- | ------------------------------------------------------------ | | == | 比較符號(hào)兩邊數(shù)據(jù)是否相等烁落,相等結(jié)果是true。 | | < | 比較符號(hào)左邊的數(shù)據(jù)是否小于右邊的數(shù)據(jù)豌注,如果小于結(jié)果是true伤塌。 | | > | 比較符號(hào)左邊的數(shù)據(jù)是否大于右邊的數(shù)據(jù),如果大于結(jié)果是true轧铁。 | | <= | 比較符號(hào)左邊的數(shù)據(jù)是否小于或者等于右邊的數(shù)據(jù)寸谜,如果小于結(jié)果是true。 | | >= | 比較符號(hào)左邊的數(shù)據(jù)是否大于或者等于右邊的數(shù)據(jù)属桦,如果小于結(jié)果是true | | != | 不等于符號(hào) ,如果符號(hào)兩邊的數(shù)據(jù)不相等他爸,結(jié)果是true聂宾。 | ### 邏輯運(yùn)算符 | 符號(hào) | 意義 | | ---- | ------------------------------------------------------------ | | && | 1. 兩邊都是true,結(jié)果是true 2. 一邊是false诊笤,結(jié)果是false 短路特點(diǎn):符號(hào)左邊是false系谐,右邊不再運(yùn)算 | | \|\| | 1. 兩邊都是false,結(jié)果是false 2. 一邊是true讨跟,結(jié)果是true 短路特點(diǎn): 符號(hào)左邊是true纪他,右邊不再運(yùn)算 | | ! | 1. ! true 結(jié)果是false 2. ! false結(jié)果是true | ### 三元運(yùn)算符(三目運(yùn)算符) **格式:** ```java 數(shù)據(jù)類型 變量名 = 布爾類型表達(dá)式 ? 結(jié)果1 : 結(jié)果2 ``` **三元運(yùn)算符計(jì)算方式:** - 布爾類型表達(dá)式結(jié)果是true晾匠,三元運(yùn)算符整體結(jié)果為結(jié)果1茶袒,賦值給變量。 - 布爾類型表達(dá)式結(jié)果是false凉馆,三元運(yùn)算符整體結(jié)果為結(jié)果2薪寓,賦值給變量亡资。 #### 案例: ```java public static void main(String[] args) { int i = (1==2 ? 100 : 200); System.out.println(i);//200 int j = (3<=4 ? 500 : 600); System.out.println(j);//500 } ``` ## 方法(函數(shù)或功能) ### 定義格式: ```java 修飾符 返回值類型 方法名 (參數(shù)列表){ 方法體 } ``` #### 案例: ```java public static void methodName() { System.out.println("這是一個(gè)方法"); } ``` ### 注意事項(xiàng) 方法定義注意事項(xiàng): - 方法必須定義在一類中方法外 - 方法不能定義在另一個(gè)方法的里面 方法調(diào)用注意事項(xiàng): - 方法在定義完畢后,方法不會(huì)自己運(yùn)行向叉,必須被調(diào)用才能執(zhí)行 - 一般在main方法中調(diào)用 ## 數(shù)組 **數(shù)組概念:** 數(shù)組就是存儲(chǔ)數(shù)據(jù)長(zhǎng)度固定的容器锥腻,保證多個(gè)數(shù)據(jù)的數(shù)據(jù)類型要一致。 ### 數(shù)組的定義 **定義格式:** ```java 數(shù)組存儲(chǔ)的數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)組存儲(chǔ)的數(shù)據(jù)類型[長(zhǎng)度]; ``` ```java 數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{元素1,元素2,元素3...}; ``` ```java 數(shù)據(jù)類型[] 數(shù)組名 = {元素1,元素2,元素3...}; ``` #### 案例: 用三種格式定義數(shù)組 ```java public static void Array() { //定義可以存儲(chǔ)3個(gè)整數(shù)的數(shù)組容器 int[] arr = new int[3]; //定義存儲(chǔ)1母谎,2瘦黑,3,4奇唤,5整數(shù)的數(shù)組容器幸斥。 int[] arr = new int[]{1,2,3,4,5}; //定義存儲(chǔ)1,2冻记,3睡毒,4,5整數(shù)的數(shù)組容器(常用) int[] arr = {1,2,3,4,5}; } ``` ### 數(shù)組的訪問(wèn) **訪問(wèn)格式:** ```java 數(shù)組名[索引] ``` > **索引**: 每一個(gè)存儲(chǔ)到數(shù)組的元素冗栗,都會(huì)自動(dòng)的擁有一個(gè)編號(hào)演顾,從0開(kāi)始,這個(gè)自動(dòng)編號(hào)稱為數(shù)組索引 (index)隅居,可以通過(guò)數(shù)組的索引訪問(wèn)到數(shù)組中的元素钠至。 #### 案例 利用索引訪問(wèn)數(shù)組 ```java public static void main(String[] args) { //定義存儲(chǔ)int類型數(shù)組,賦值元素1胎源,2棉钧,3,4涕蚤,5 int[] arr = {1,2,3,4,5}; //為0索引元素賦值為6 arr[0] = 6; //獲取數(shù)組0索引上的元素 int i = arr[0]; System.out.println(i); //直接輸出數(shù)組0索引元素 System.out.println(arr[0]); } ``` ### 數(shù)組的遍歷 ### 數(shù)組內(nèi)存圖 ## 面向?qū)ο? **概述**: Java語(yǔ)言是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言宪卿,而面向?qū)ο笏枷胧且环N程序設(shè)計(jì)思想,我們?cè)诿嫦驅(qū)ο笏枷氲闹敢拢?使用Java語(yǔ)言去設(shè)計(jì)万栅、開(kāi)發(fā)計(jì)算機(jī)程序佑钾。 這里的對(duì)象泛指現(xiàn)實(shí)中一切事物,每種事物都具備自己的屬性和行為烦粒。面 向?qū)ο笏枷刖褪窃谟?jì)算機(jī)程序設(shè)計(jì)過(guò)程中休溶,參照現(xiàn)實(shí)中事物,將事物的屬性特征扰她、行為特征抽象出來(lái)兽掰,描述成計(jì)算 機(jī)事件的設(shè)計(jì)思想。 它區(qū)別于面向過(guò)程思想徒役,強(qiáng)調(diào)的是通過(guò)調(diào)用對(duì)象的行為來(lái)實(shí)現(xiàn)功能孽尽,而不是自己一步一步的去 操作實(shí)現(xiàn)。 **舉例:** 把大象放進(jìn)冰箱: 洗衣服: - 面向過(guò)程:把衣服脫下來(lái)-->找一個(gè)盆-->放點(diǎn)洗衣粉-->加點(diǎn)水-->浸泡10分鐘-->揉一揉-->清洗衣服-->擰干-->晾 起來(lái) - 面向?qū)ο螅喊岩路撓聛?lái)-->打開(kāi)全自動(dòng)洗衣機(jī)-->扔衣服-->按鈕-->晾起來(lái) **區(qū)別:** - 面向過(guò)程:強(qiáng)調(diào)步驟忧勿。 - 面向?qū)ο螅簭?qiáng)調(diào)對(duì)象泻云,這里的對(duì)象就是洗衣機(jī) > 面向?qū)ο笏枷胧且环N更符合我們思考習(xí)慣的思想艇拍,它可以將復(fù)雜的事情簡(jiǎn)單化,并將我們從執(zhí)行者變成了指揮者宠纯。 面向?qū)ο蟮恼Z(yǔ)言中卸夕,包含了三大基本特征,即封裝婆瓜、繼承和多態(tài)快集。 ## 類與對(duì)象 ### 類的定義 定義格式: ```java public class ClassName { //成員變量 //成員方法 } ``` **案例**:定義一個(gè)學(xué)生類 ```java public class Student { //成員變量 String name;//姓名 int age廉白;//年齡 //成員方法 //學(xué)習(xí)的方法 public void study() { System.out.println("好好學(xué)習(xí)个初,天天向上"); } //吃飯的方法 public void eat() { System.out.println("學(xué)習(xí)餓了要吃飯"); } } ``` ### 對(duì)象的定義 創(chuàng)建對(duì)象的格式: ```java 類名 對(duì)象名 = new 類名(); ``` 訪問(wèn)對(duì)象中的成員的格式: ```java 對(duì)象名.成員變量; 對(duì)象名.成員方法()猴蹂; ``` **案例:**利用上一個(gè)案例定義的學(xué)生類院溺,實(shí)例化對(duì)象并訪問(wèn)對(duì)象中的成員 ```java public class Test { public static void main(String[] args) { //創(chuàng)建對(duì)象格式:類名 對(duì)象名 = new 類名(); Student s = new Student(); System.out.println("s:"+s); //直接輸出成員變量值 System.out.println("姓名:"+s.name); //null System.out.println("年齡:"+s.age); //0 System.out.println("‐‐‐‐‐‐‐‐‐‐"); //給成員變量賦值 s.name = "charles"; s.age = 18; //再次輸出成員變量的值 System.out.println("姓名:"+s.name);//charles System.out.println("年齡:"+s.age);//18 //調(diào)用成員方法 s.study(); // "好好學(xué)習(xí),天天向上" s.eat(); // "學(xué)習(xí)餓了要吃飯" } } ``` ### 對(duì)象的內(nèi)存圖 ## 封裝性 將`屬性`隱藏起來(lái)磅轻,若需要訪問(wèn)某個(gè)`屬性`珍逸,提供`公共方法`對(duì)其訪問(wèn)模狭。 使用 `private` 關(guān)鍵字來(lái)修飾成員變量昌屉。 對(duì)需要訪問(wèn)的`成員變量`,提供對(duì)應(yīng)的一對(duì) `getXxx` 方法 脯倒、 `setXxx` 方法撮躁。 ### private - private是一個(gè)權(quán)限修飾符漱病,代表最小權(quán)限。 - 可以修飾成員變量和成員方法把曼。 - 被private修飾后的成員變量和成員方法杨帽,只在本類中才能訪問(wèn)。 **格式:** ```java private 數(shù)據(jù)類型 變量名 嗤军; ``` **案例**:使用private關(guān)鍵字定義學(xué)生類 ```java public class Student { private String name; private int age; public void setName(String n) { name = n; } public String getName() { return name; } public void setAge(int a) { age = a; } public int getAge() { return age; } } ``` ### this - this代表所在類的當(dāng)前對(duì)象的引用(地址值)注盈,即對(duì)象自己的引用。 **格式:** ```java this.成員變量名型雳; ``` **案例:**使用 this 修飾方法中的變量,解決參數(shù)和成員變量字段相同導(dǎo)致的二義性問(wèn)題 ```java public class Student { private String name; private int age; public void setName(String name) { //name = name; //編譯器認(rèn)為name為參數(shù)中的name山害,造成無(wú)效賦值 this.name = name; } public String getName() { return name; } public void setAge(int age) { //age = age; this.age = age; } public int getAge() { return age; } } ``` ## 繼承性 ### 繼承的定義: **繼承**::就是子類繼承父類的屬性和行為纠俭,使得子類對(duì)象具有與父類相同的屬性、相同的行為浪慌。子類可以直接 訪問(wèn)父類中的**非私有**的屬性和行為冤荆。 **繼承格式:** 通過(guò) extends 關(guān)鍵字,可以聲明一個(gè)子類繼承另外一個(gè)父類 ```java class 父類 { ... } class 子類 extends 父類 { ... } ``` **特點(diǎn):** - 提高代碼的復(fù)用性权纤。 - 類與類之間產(chǎn)生了關(guān)系钓简,是多態(tài)的前提乌妒。 - Java只支持單繼承,不支持多繼承外邓。 - Java支持多層繼承(繼承體系)撤蚊。 - 子類和父類是一種相對(duì)的概念。 ### super - 子父類中出現(xiàn)了同名的成員變量時(shí)损话,在子類中需要訪問(wèn)父類中非私有成員變量時(shí)侦啸,需要使用 `super` 關(guān)鍵字 **格式:** ```java super.父類成員變量名 ``` **案例:**使用super關(guān)鍵字訪問(wèn)父類重名成員 ```java class Father { // Father中的成員變量。 int num = 5; } class Son extends Father { // Son中的成員變量 int num = 6; public void show() { //訪問(wèn)父類中的num System.out.println("Father num=" + super.num); //訪問(wèn)子類中的num System.out.println("Son num=" + this.num); } } ``` ### Override - 如果子類父類中出現(xiàn)重名的成員方法丧枪,這時(shí)的訪問(wèn)是一種特殊情況光涂,叫做**方法重寫** (Override)。 - 子類中出現(xiàn)與父類一模一樣的方法時(shí)(返回值類型拧烦,方法名和參數(shù)列表都相同)忘闻,會(huì)出現(xiàn)覆蓋效 果,也稱為重寫或者復(fù)寫恋博。**聲明不變齐佳,重新實(shí)現(xiàn)**。 **案例:**子類重寫父類的成員方法 ```java class Father { public void show() { System.out.println("Father show"); } } class Son extends Father { //子類重寫了父類的show方法 public void show() { System.out.println("Son show"); } } public class Test{ public static void main(String[] args) { Son s = new Son(); // 子類中有show方法交播,只執(zhí)行重寫后的show方法 s.show(); // Son show } } ``` **特別注意:** - 子類方法覆蓋父類方法重虑,必須要保證權(quán)限大于等于父類權(quán)限。 - 子類方法覆蓋父類方法秦士,返回值類型缺厉、函數(shù)名和參數(shù)列表都要一模一樣。 ### abstract **使用格式:** 抽象方法: ```java 修飾符 abstract 返回值類型 方法名 (參數(shù)列表)隧土; ``` 抽象類: ```java abstract class 類名 { } ``` **代碼舉例:** ```java //抽象方法: public abstract void method()提针; //抽象類: public abstract class ClassName { } ``` **案例:** 定義動(dòng)物抽象類,實(shí)例化貓運(yùn)行抽象類中的成員方法 ```java public class Cat extends Animal { public void run (){ System.out.println("小貓?jiān)趬︻^走~~~")曹傀; } } public class Test { public static void main(String[] args) { // 創(chuàng)建子類對(duì)象 Cat c = new Cat(); // 調(diào)用run方法 c.run(); } } ``` **注意事項(xiàng):** - 抽象類不能創(chuàng)建對(duì)象辐脖,如果創(chuàng)建,編譯無(wú)法通過(guò)而報(bào)錯(cuò)皆愉。只能創(chuàng)建其非抽象子類的對(duì)象嗜价。 - 抽象類中,可以有構(gòu)造方法幕庐,是供子類創(chuàng)建對(duì)象時(shí)久锥,初始化父類成員使用的。 - 抽象類中异剥,不一定包含抽象方法瑟由,但是有抽象方法的類必定是抽象類。 - 抽象類的子類冤寿,必須重寫抽象父類中所有的抽象方法歹苦,否則青伤,編譯無(wú)法通過(guò)而報(bào)錯(cuò)。除非該子類也是抽象 類殴瘦。 ## 多態(tài)性 - 當(dāng)使用多態(tài)方式調(diào)用方法時(shí)狠角,首先檢查父類中是否有該方法,如果沒(méi)有痴施,則編譯錯(cuò)誤擎厢;如果有,執(zhí)行的是子類重寫 后方法辣吃。 - 利用父類指針指向子類對(duì)象 ### 多態(tài)的定義: **多態(tài):** 是指同一行為动遭,具有多個(gè)不同表現(xiàn)形式。 **多態(tài)體現(xiàn)的格式:** ```java 父類類型 變量名 = new 子類對(duì)象神得; 變量名.方法名(); ``` **特點(diǎn):** - 實(shí)際開(kāi)發(fā)的過(guò)程中厘惦,父類類型作為方法形式參數(shù),傳遞子類對(duì)象給方法哩簿,進(jìn)行方法的調(diào)用宵蕉,更能體現(xiàn)出多態(tài)的擴(kuò)展 性與便利 ### **案例:** 定義父類: ```java public abstract class Animal { public abstract void eat(); } ``` 定義子類: ```java class Cat extends Animal { public void eat() { System.out.println("吃魚"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨頭"); } } ``` 定義測(cè)試類: ```java public class Test { public static void main(String[] args) { // 多態(tài)形式,創(chuàng)建對(duì)象 Cat c = new Cat(); Dog d = new Dog(); // 調(diào)用showCatEat showCatEat(c); // 調(diào)用showDogEat showDogEat(d); /* 以上兩個(gè)方法, 均可以被showAnimalEat(Animal a)方法所替代 而執(zhí)行效果一致 */ showAnimalEat(c); showAnimalEat(d); } public static void showCatEat (Cat c){ c.eat(); } public static void showDogEat (Dog d){ d.eat(); } public static void showAnimalEat (Animal a){ a.eat(); } } ``` ### 多態(tài)的轉(zhuǎn)型 - **當(dāng)父類引用指向一個(gè)子類對(duì)象時(shí)节榜,便是向上轉(zhuǎn)型羡玛。** - **一個(gè)已經(jīng)向上轉(zhuǎn)型的子類對(duì)象,將父類引用轉(zhuǎn)為子類引用宗苍,可以使用強(qiáng)制類型轉(zhuǎn)換的格式稼稿,便是向下轉(zhuǎn)型。** #### 向上轉(zhuǎn)型 **向上轉(zhuǎn)型:**多態(tài)本身是子類類型向父類類型向上轉(zhuǎn)換的過(guò)程讳窟,這個(gè)過(guò)程是默認(rèn)的让歼。 當(dāng)父類引用指向一個(gè)子類對(duì)象時(shí),便是向上轉(zhuǎn)型丽啡。 **使用格式:** ```java 父類類型 變量名 = new 子類類型(); 如:Animal a = new Cat(); ``` #### 向下轉(zhuǎn)型 **向下轉(zhuǎn)型:**父類類型向子類類型向下轉(zhuǎn)換的過(guò)程谋右,這個(gè)過(guò)程是強(qiáng)制的。 **使用格式:** ```java 子類類型 變量名 = (子類類型) 父類變量名; 如:Cat c =(Cat) a; ``` #### 轉(zhuǎn)型異常 轉(zhuǎn)型的過(guò)程中补箍,一不小心就會(huì)遇到這樣的問(wèn)題改执,請(qǐng)看如下代碼: ```java public class Test { public static void main(String[] args) { // 向上轉(zhuǎn)型 Animal a = new Cat(); a.eat(); // 調(diào)用的是 Cat 的 eat // 向下轉(zhuǎn)型 Dog d = (Dog)a; d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse 【運(yùn)行報(bào)錯(cuò)】 } } ``` 這段代碼可以通過(guò)編譯,但是運(yùn)行時(shí)坑雅,卻報(bào)出了 `ClassCastException` 辈挂,類型轉(zhuǎn)換異常 這兩個(gè)類型并沒(méi)有任何繼承關(guān)系,不符合類型轉(zhuǎn)換的定義 為了避免`ClassCastException`的發(fā)生霞丧,Java提供了 `instanceof` 關(guān)鍵字呢岗,給引用變量做類型的校驗(yàn)冕香,格式如下: ```java 變量名 instanceof 數(shù)據(jù)類型 ``` 如果變量屬于該數(shù)據(jù)類型蛹尝,返回true后豫。 如果變量不屬于該數(shù)據(jù)類型,返回false突那。 所以挫酿,轉(zhuǎn)換前,我們最好先做一個(gè)判斷愕难,代碼如下: ```java public class Test { public static void main(String[] args) { // 向上轉(zhuǎn)型 Animal a = new Cat(); a.eat(); // 調(diào)用的是 Cat 的 eat // 向下轉(zhuǎn)型 if (a instanceof Cat){ Cat c = (Cat)a; c.catchMouse(); // 調(diào)用的是 Cat 的 catchMouse } else if (a instanceof Dog){ Dog d = (Dog)a; d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse } } } ``` ## 接口
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末早龟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猫缭,更是在濱河造成了極大的恐慌葱弟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜丹,死亡現(xiàn)場(chǎng)離奇詭異芝加,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)射窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門藏杖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脉顿,你說(shuō)我怎么就攤上這事蝌麸。” “怎么了艾疟?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵来吩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汉柒,道長(zhǎng)误褪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任碾褂,我火速辦了婚禮兽间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘正塌。我一直安慰自己嘀略,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布乓诽。 她就那樣靜靜地躺著帜羊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸠天。 梳的紋絲不亂的頭發(fā)上讼育,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼奶段。 笑死饥瓷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痹籍。 我是一名探鬼主播呢铆,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蹲缠!你這毒婦竟也來(lái)了棺克?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤线定,失蹤者是張志新(化名)和其女友劉穎娜谊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斤讥,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡因俐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了周偎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹剩。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蓉坎,靈堂內(nèi)的尸體忽然破棺而出澳眷,到底是詐尸還是另有隱情,我是刑警寧澤蛉艾,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布钳踊,位于F島的核電站,受9級(jí)特大地震影響勿侯,放射性物質(zhì)發(fā)生泄漏拓瞪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一助琐、第九天 我趴在偏房一處隱蔽的房頂上張望祭埂。 院中可真熱鬧,春花似錦兵钮、人聲如沸蛆橡。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泰演。三九已至,卻和暖如春葱轩,著一層夾襖步出監(jiān)牢的瞬間睦焕,已是汗流浹背藐握。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垃喊,地道東北人趾娃。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缔御,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妇蛀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容