Win7下如何打開DOS控制臺(tái)?
- a:開始--所有程序--附件--命令提示符
- b:開始--搜索程序和文件--cmd--回車
- c:win+r--cmd--回車
常見的DOS命令
- d: 盤符切換
- dir (directory)列出當(dāng)前目錄下的文件以及文件夾
- cd (change directory)改變指定目錄(進(jìn)入指定目錄)
- cd.. 退回到上一級(jí)目錄
- cd\ 退回到根目錄
- cls (clear screen)清屏
- exit 退出dos命令行(分割線上的需要掌握,下的了解)
Java語言跨平臺(tái)原理
- a:什么是跨平臺(tái)性
- 通過Java語言編寫的應(yīng)用程序在不同的系統(tǒng)平臺(tái)上都可以運(yùn)行
- b:Java語言跨平臺(tái)原理
- 只要在需要運(yùn)行java應(yīng)用程序的操作系統(tǒng)上,先安裝一個(gè)Java虛擬機(jī)(JVM Java Virtual Machine)即可。由JVM來負(fù)責(zé)Java程序在該系統(tǒng)中的運(yùn)行。
-
c:Java語言跨平臺(tái)圖解
JRE和JDK的概述
- a:什么是JRE
- 包括Java虛擬機(jī)(JVM Java Virtual Machine)和Java程序所需的核心類庫等,如果想要運(yùn)行一個(gè)開發(fā)好的Java程序,計(jì)算機(jī)中只需要安裝JRE即可。
- JRE:JVM+類庫。
- b:什么是JDK
- JDK是提供給Java開發(fā)人員使用的,其中包含了java的開發(fā)工具,也包括了JRE。所以安裝了JDK,就不用在單獨(dú)安裝JRE了。
- 其中的開發(fā)工具:編譯工具(javac.exe) 打包工具(jar.exe)等
- JDK:JRE+JAVA的開發(fā)工具。
- c:為什么JDK中包含一個(gè)JRE呢?
- 開發(fā)完的程序,需要運(yùn)行一下看看效果。
- d:JDK,JRE,JVM的作用和關(guān)系


Java語言的書寫格式(約定俗成)
- 1.大括號(hào)要對(duì)齊,并且成對(duì)寫
- 2.左大括號(hào)前面有空格
- 3.遇到左大括號(hào)要縮進(jìn),Tab
- 4.方法和程序塊之間加空行讓程序看起來清晰
- 5.并排語句之間加空格,例如for語句
- 6.運(yùn)算符兩側(cè)加空格
關(guān)鍵字的概述和使用
- a:什么是關(guān)鍵字
- 被Java語言賦予特定含義的單詞
- b:關(guān)鍵字的特點(diǎn)
- 組成關(guān)鍵字的字母全部小寫
- c:常見關(guān)鍵字
- public static void class等
標(biāo)識(shí)符的概述和組成規(guī)則
標(biāo)識(shí)符的概述和組成規(guī)則)(掌握)
- a:什么是標(biāo)識(shí)符
- 就是給類,接口,方法,變量等起名字時(shí)使用的字符序列
- b:標(biāo)識(shí)符的組成規(guī)則
- 英文大小寫字母
- 數(shù)字字符
- $和_
- c:標(biāo)識(shí)符注意事項(xiàng)
- 1,不能使用關(guān)鍵字
- 2,不能數(shù)字開頭
標(biāo)識(shí)符中常見的命名規(guī)則
- 見名知意
- a:包
- 最好是域名倒過來,要求所有的字母小寫
- b:類或者接口
- 如果是一個(gè)單詞首字母大寫
- 如果是多個(gè)單詞每個(gè)單詞首字母大寫(駝峰標(biāo)識(shí))
- c:方法或者變量
- 如果是一個(gè)單詞全部小寫
- 如果是多個(gè)單詞,從第二個(gè)單詞首字母大寫
- d:常量
- 如果是一個(gè)單詞,所有字母大寫
- 如果是多個(gè)單詞,所有的單詞大寫,用下劃線區(qū)分每個(gè)單詞
常量的概述和使用
- A:什么是常量
- 在程序執(zhí)行的過程中其值不可以發(fā)生改變
- B:Java中常量的分類
- 字面值常量
- 自定義常量(面向?qū)ο蟛糠种v)
- C:字面值常量的分類
- 字符串常量 用雙引號(hào)括起來的內(nèi)容
- 整數(shù)常量 所有整數(shù)
- 小數(shù)常量 所有小數(shù)
- 字符常量 用單引號(hào)括起來的內(nèi)容,里面只能放單個(gè)數(shù)字,單個(gè)字母或單個(gè)符號(hào),如:
System.out.println('10'); 編譯錯(cuò)誤 '10'必須放單個(gè)字符,10代表的是1字符和0字符;
System.out.println(''); 編譯錯(cuò)誤 ''中什么也不放,不能代表任何字符;
System.out.println(' '); 編譯成功 ' '中代表空格字符; - 布爾常量 較為特殊,只有true和false
- 空常量 null(數(shù)組部分講解)
任意進(jìn)制到十進(jìn)制的轉(zhuǎn)換圖解
十進(jìn)制到任意進(jìn)制的轉(zhuǎn)換圖解
快速的進(jìn)制轉(zhuǎn)換法
原碼反碼補(bǔ)碼
- 原碼
- 就是二進(jìn)制定點(diǎn)表示法,即最高位為符號(hào)位,“0”表示正,“1”表示負(fù),其余位表示數(shù)值的大小。
- 通過一個(gè)字節(jié),也就是8個(gè)二進(jìn)制位表示+7和-7
- 0(符號(hào)位) 0000111
- 1(符號(hào)位) 0000111
- 反碼
- 正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
- 補(bǔ)碼
-
正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。
-
變量的概述及格式
- A:什么是變量
- 在程序執(zhí)行的過程中,在某個(gè)范圍內(nèi)其值可以發(fā)生改變的量
- B:變量的定義格式
- 數(shù)據(jù)類型 變量名 = 變量值;
- C:為什么要定義變量
- 用來不斷的存放同一類型的常量,并可以重復(fù)使用
數(shù)據(jù)類型的概述和分類
- A:為什么有數(shù)據(jù)類型
- Java語言是強(qiáng)類型語言,對(duì)于每一種數(shù)據(jù)都定義了明確的具體數(shù)據(jù)類型,在內(nèi)存中分配了不同大小的內(nèi)存空間
- B:Java中數(shù)據(jù)類型的分類
- 基本數(shù)據(jù)類型
- 引用數(shù)據(jù)類型
- 面向?qū)ο蟛糠种v解
- C:基本數(shù)據(jù)類型分類(4類8種)
- 整數(shù)型
- byte 占一個(gè)字節(jié) -128到127
- short 占兩個(gè)字 -215~215-1
- int 占四個(gè)字節(jié) -231~231-1 (整數(shù)默認(rèn)的數(shù)據(jù)類型)
- long 占八個(gè)字節(jié) -263~263-1 (如果long類型加L進(jìn)行表示最好加大寫的L,因?yàn)樾懙膌和1太像了 long x = 888888888L;【用L標(biāo)示,要不然會(huì)報(bào)錯(cuò),因?yàn)檎麛?shù)默認(rèn)為int類型,888888888超過了int范圍】)
- 浮點(diǎn)型
- float 占四個(gè)字節(jié) -3.403E38~3.403E38 單精度 (float f = 12.3F;小數(shù)默認(rèn)的數(shù)據(jù)類型為double,直接賦值會(huì)損失精度,要加上F進(jìn)行標(biāo)示)
- double 占八個(gè)字節(jié) -1.798E308~1.798E308 雙精度 (小數(shù)默認(rèn)的數(shù)據(jù)類型)
- 字符型
- char 占兩個(gè)字節(jié) 0~65535
- 布爾型
- boolean true 和 false
- boolean理論上是占八分之一個(gè)字節(jié),因?yàn)橐粋€(gè)開關(guān)就可以決定是true和false了,但是java中boolean類型沒有明確指定他的大小
- 整數(shù)型
使用變量的注意事項(xiàng)
- a:作用域問題
- 同一個(gè)區(qū)域不能使用相同的變量名
- b:初始化值問題
- 局部變量在使用之前必須賦值
- c:一條語句可以定義幾個(gè)變量
- int a,b,c...;
數(shù)據(jù)類型轉(zhuǎn)換之隱式轉(zhuǎn)換
- Java中的默認(rèn)轉(zhuǎn)換規(guī)則
-
取值范圍小的數(shù)據(jù)類型與取值范圍大的數(shù)據(jù)類型進(jìn)行運(yùn)算,會(huì)先將小的數(shù)據(jù)類型提升為大的,再運(yùn)算
隱式轉(zhuǎn)換
-
數(shù)據(jù)類型轉(zhuǎn)換之強(qiáng)制轉(zhuǎn)換
- A:強(qiáng)制轉(zhuǎn)換問題
- int a = 10;
- byte b = 20;
- b = a + b;
- B:強(qiáng)制轉(zhuǎn)換的格式
-
b = (byte)(a + b);
強(qiáng)制轉(zhuǎn)換過程 - C:強(qiáng)制轉(zhuǎn)換的注意事項(xiàng)
-
如果超出了被賦值的數(shù)據(jù)類型的取值范圍得到的結(jié)果會(huì)與你期望的結(jié)果不同
強(qiáng)制轉(zhuǎn)換的注意事項(xiàng)
面試題之變量相加和常量相加的區(qū)別
- 面試題:看下面的程序是否有問題,如果有問題,請指出并說明理由。
- byte b1 = 3;
- byte b2 = 4;
- byte b3 = b1 + b2;
- 從兩方面去回答這個(gè)題
- b1和b2是兩個(gè)變量,變量里面存儲(chǔ)的值都是變化的,所以在程序運(yùn)行中JVM是無法判斷里面具體的值
- byte類型的變量在進(jìn)行運(yùn)算的時(shí)候,會(huì)自動(dòng)類型提升為int類型
- byte b4 = 3 + 4;
- 3和4都是常量,java有常量優(yōu)化機(jī)制,就是在編譯的的時(shí)候直接把3和4的結(jié)果賦值給b4了
long與float的取值范圍誰大誰小
-
進(jìn)行混合運(yùn)算的時(shí)候,byte,short,char不會(huì)相互轉(zhuǎn)換,都會(huì)自動(dòng)類型提升為int類型,其他類型進(jìn)行混合運(yùn)算的是小的數(shù)據(jù)類型提升為大的
- byte,short,char -- int -- long -- float -- double
- long: 8個(gè)字節(jié)
- float: 4個(gè)字節(jié)
- IEEE754規(guī)定
- 4個(gè)字節(jié)是32個(gè)二進(jìn)制位,其中
- 1位是符號(hào)位
- 8位是指數(shù)位
- 00000000 11111111
- 0到255
- 1到254
- -126到127
- 23位是尾數(shù)位
- 每個(gè)指數(shù)位減去127
A:它們底層的存儲(chǔ)結(jié)構(gòu)不同。
-
B:float表示的數(shù)據(jù)范圍比long的范圍要大
- long:2^63-1
- float:3.410^38 > 210^38 > 28^38 = 22338 = 2*2^114 > 2^63-1
字符和字符串參與運(yùn)算
- System.out.println('a'); ===> 輸出a字符
- System.out.println('a'+1); ===> 輸出98,因?yàn)閍的ASCII碼是97
- System.out.println(char('a'+1)); ===> 輸出b,因?yàn)閎的ASCII碼是98
- System.out.println("hello"+'a'+1); ===> 輸出helloa1,因?yàn)槿魏螖?shù)據(jù)類型用+ 與字符串相連接都會(huì)生成新的字符串
- System.out.println('a'+1+"hello"); ===> 輸出98hello
- D:+在有字符串參與中被稱為字符串連接符
- System.out.println("5+5="+5+5); ===> 輸出5+5=55
- System.out.println(5+5+"=5+5"); ===> 輸出10=5+5
char數(shù)據(jù)類型
- Java語言中的字符char可以存儲(chǔ)一個(gè)中文漢字嗎?為什么呢?
- 可以。因?yàn)镴ava語言采用的是Unicode編碼。Unicode編碼中的每個(gè)字符占用兩個(gè)字節(jié)。中文也是占的兩個(gè)字節(jié)
- 所以,Java中的字符可以存儲(chǔ)一個(gè)中文漢字
算術(shù)運(yùn)算符的基本用法
- A:什么是運(yùn)算符
- 就是對(duì)常量和變量進(jìn)行操作的符號(hào)。
- B:運(yùn)算符的分類
- 算術(shù)運(yùn)算符,賦值運(yùn)算符,比較(關(guān)系或條件)運(yùn)算符,邏輯運(yùn)算符,位運(yùn)算符,三目(元)運(yùn)算符
- C:算數(shù)運(yùn)算符有哪些
- +,-,*,/,%,++,--
- D:注意事項(xiàng):
- a: +號(hào)在java中有三種作用,代表正號(hào),做加法運(yùn)算,字符串的連接符
- b: 整數(shù)相除只能得到整數(shù)。如果想得到小數(shù),必須把數(shù)據(jù)變化為浮點(diǎn)數(shù)類型
10 / 3 = 3
10 / 3.0 = 3.3333333....(把其中一個(gè)數(shù)變成小數(shù),另一個(gè)數(shù)在運(yùn)算的時(shí)候會(huì)自動(dòng)類型提升) - c: /獲取的是除法操作的商,%獲取的是除法操作的余數(shù)
- %運(yùn)算符
- 當(dāng)左邊的絕對(duì)值小于右邊絕對(duì)值時(shí),結(jié)果是左邊
1 / 5 = 1 - 當(dāng)左邊的絕對(duì)值等于右邊或是右邊的倍數(shù)時(shí),結(jié)果是0
5 / 5 = 0 - 當(dāng)左邊的絕對(duì)值大于右邊絕對(duì)值時(shí),結(jié)果是余數(shù)
7 / 5 = 2 - %運(yùn)算符結(jié)果的符號(hào)只和左邊有關(guān)系,與右邊無關(guān)
-12 / 5 = -12 / (-5) = -2 - 任何一個(gè)正整數(shù)%2結(jié)果不是0就是1可以用來當(dāng)作切換條件
1 / 2 = 1 2 / 2 = 0 3 / 2 = 1 4 / 2 = 0
算術(shù)運(yùn)算符++和--的用法
- a: 單獨(dú)使用:
- 放在操作數(shù)的前面和后面效果一樣。(這種用法是我們比較常見的)
- b: 參與運(yùn)算使用:
- 放在操作數(shù)的前面,先自增或者自減,然后再參與運(yùn)算。
- 放在操作數(shù)的后面,先參與運(yùn)算,再自增或者自減。
int a = 10;
int b = 10;
int c = 10;
a = b++; // a = 10; b = 11
c = --a; // c = 9; a = 9
b = ++a; // b = 10; a = 10
a = c--; //a = 9; c = 8 - 請分別計(jì)算出x,y的值?
int x = 4;
int y = (x++)+(++x)+(x10); // y = 4 + 6 + 6 10 = 70; x = 6 - 面試題
byte b = 10;
① b++;
② b = b + 1;
問哪句會(huì)報(bào)錯(cuò),為什么
第二句會(huì)報(bào)錯(cuò) , 因?yàn)閎++底層會(huì)自動(dòng)加強(qiáng)轉(zhuǎn)換符【b=(byte)(b+1)】; 而當(dāng)byte 與 int 進(jìn)行混合運(yùn)算的時(shí)候,會(huì)提升為int類型, 兩個(gè)int相加的結(jié)果還是int, 賦值給byte會(huì)損失精度
賦值運(yùn)算符的基本用法
- A:賦值運(yùn)算符有哪些
-
a:基本的賦值運(yùn)算符:=
- 把=右邊的數(shù)據(jù)賦值給左邊。
-
b:擴(kuò)展的賦值運(yùn)算符:+=,-=,*=,/=,%=
- += 把左邊和右邊做加法,然后賦值給左邊。
-
關(guān)系運(yùn)算符及其注意事項(xiàng)
- 關(guān)系運(yùn)算符有哪些(比較運(yùn)算符,條件運(yùn)算符)
- ==,!=,>,>=,<,<=
- 注意事項(xiàng):
- 無論你的操作是簡單還是復(fù)雜,結(jié)果是boolean類型。
- "=="不能寫成"="。
邏輯運(yùn)算符的基本用法
- A:邏輯運(yùn)算符有哪些
- &,|,^,!
- &&,||
- B:案例演示
-
邏輯運(yùn)算符的基本用法
邏輯運(yùn)算符的基本用法 - 注意事項(xiàng):
- a:邏輯運(yùn)算符一般用于連接boolean類型的表達(dá)式或者值。
- b:表達(dá)式:就是用運(yùn)算符把常量或者變量連接起來的符合java語法的式子。
- 算術(shù)表達(dá)式:a + b
- 比較表達(dá)式:a == b(條件表達(dá)式)
- C:結(jié)論:
- &邏輯與:有false則false。
- |邏輯或:有true則true。
- ^邏輯異或:相同為false,不同為true。
- !邏輯非:非false則true,非true則false。
- 特點(diǎn):偶數(shù)個(gè)不改變本身。
邏輯運(yùn)算符&&和&的區(qū)別(|| 與 | 同理)
- a:最終結(jié)果一樣。
- b:&&具有短路效果。左邊是false,右邊不執(zhí)行。
-
&是無論左邊是false還是true,右邊都會(huì)執(zhí)行
&&和&的區(qū)別
位運(yùn)算符的基本用法
- A:位運(yùn)算符有哪些
- &,|,^,~ ,>>,>>>,<<
- B:案例演示
-
位運(yùn)算符的基本用法1
位運(yùn)算符的基本用法 - &,|,^,~ 的用法
- &:有0則0
- |:有1則1
- ^:相同則0,不同則1
- ~:按位取反
-
位運(yùn)算符的基本用法2
位運(yùn)算符的基本用法2
三元運(yùn)算符的格式
- (關(guān)系表達(dá)式) ? 表達(dá)式1 : 表達(dá)式2;
鍵盤錄入的基本格式
- A:為什么要使用鍵盤錄入數(shù)據(jù)
- a:為了讓程序的數(shù)據(jù)更符合開發(fā)的數(shù)據(jù)
- b:讓程序更靈活一下
- B:如何實(shí)現(xiàn)鍵盤錄入呢?
- 先照格式來。
- a:導(dǎo)包
- 格式:
- import java.util.Scanner;
- 位置:
- 在class上面。
- b:創(chuàng)建鍵盤錄入對(duì)象
- 格式:
- Scanner sc = new Scanner(System.in);
- c:通過對(duì)象獲取數(shù)據(jù)
- 格式:
- int x = sc.nextInt();
選擇結(jié)構(gòu)if語句注意事項(xiàng)
- a:比較表達(dá)式無論簡單還是復(fù)雜,結(jié)果必須是boolean類型
- b:if語句控制的語句體如果是一條語句,大括號(hào)可以省略;
- 如果是多條語句,就不能省略。建議永遠(yuǎn)不要省略。
- c:一般來說:有左大括號(hào)就沒有分號(hào),有分號(hào)就沒有左大括號(hào)
if語句和三元的相互轉(zhuǎn)換問題
- if語句和三元運(yùn)算符的區(qū)別
- 三元運(yùn)算符實(shí)現(xiàn)的,都可以采用if語句實(shí)現(xiàn)。反之不成立。
- 什么時(shí)候if語句實(shí)現(xiàn)不能用三元改進(jìn)呢?
- 當(dāng)if語句控制的操作是一個(gè)輸出語句的時(shí)候就不能。
- 為什么呢?因?yàn)槿\(yùn)算符是一個(gè)運(yùn)算符,運(yùn)算符操作完畢就應(yīng)該有一個(gè)結(jié)果,而不是一個(gè)輸出。
選擇結(jié)構(gòu)switch語句
switch(表達(dá)式) {
(表達(dá)式可以接收:
基本數(shù)據(jù)類型:byte、short、char、int
引用數(shù)據(jù)類型:枚舉(JDK1.5)String字符串(JDK1.7)
)
case 值1:
語句體1;
break;
case 值2:
語句體2;
break;
…
default:
語句體n+1;
break;
}
選擇結(jié)構(gòu)switch語句的注意事項(xiàng)
- a:case后面只能是常量,不能是變量,而且,多個(gè)case后面的值不能出現(xiàn)相同的
- b:default可以省略嗎?
- 可以省略,但是不建議,因?yàn)樗淖饔檬菍?duì)不正確的情況給出提示。
- 特殊情況:
- case就可以把值固定。
- A,B,C,D
- c:break可以省略嗎?
- 最后一個(gè)可以省略,其他最好不要省略
- 會(huì)出現(xiàn)一個(gè)現(xiàn)象:case穿透。
- 最終我們建議不要省略
- d:default一定要在最后嗎?
- 不是,可以在任意位置。但是建議在最后。
- e:switch語句的結(jié)束條件
- a:遇到break就結(jié)束了
- b:執(zhí)行到switch的右大括號(hào)就結(jié)束了
選擇結(jié)構(gòu)switch語句練習(xí)
A:看程序?qū)懡Y(jié)果:---------y=4
int x = 2;
int y = 3;
switch(x){
default:
y++;
break;
case 3:
y++;
case 4:
y++;
}
System.out.println("y="+y);B:看程序?qū)懡Y(jié)果:--------y=6
int x = 2;
int y = 3;
switch(x){
default:
y++;
case 3:
y++;
case 4:
y++;
}
System.out.println("y="+y);
方法的概述
- 方法:就是完成特定功能的代碼塊。
- 注意:在很多語言里面有函數(shù)的定義,而在Java中,函數(shù)被稱為方法。
- 方法重載
- 在同一個(gè)類中,方法名相同,參數(shù)列表不同。與返回值無關(guān)。
參數(shù)列表不同: 參數(shù)的個(gè)數(shù)不同; 參數(shù)的對(duì)應(yīng)的數(shù)據(jù)類型不同。
- 在同一個(gè)類中,方法名相同,參數(shù)列表不同。與返回值無關(guān)。
數(shù)組概述和定義格式說明
A:為什么要有數(shù)組(容器)
為了存儲(chǔ)同種數(shù)據(jù)類型的多個(gè)值
B:數(shù)組概念
數(shù)組是存儲(chǔ)同一種數(shù)據(jù)類型多個(gè)元素的集合。也可以看成是一個(gè)容器。
數(shù)組既可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用數(shù)據(jù)類型。
C:數(shù)組定義格式
數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組的長度];
數(shù)組的初始化動(dòng)態(tài)初始化
A:什么是數(shù)組的初始化
就是為數(shù)組開辟連續(xù)的內(nèi)存空間,并為每個(gè)數(shù)組元素賦予值
B:如何對(duì)數(shù)組進(jìn)行初始化
a:動(dòng)態(tài)初始化 只指定長度,由系統(tǒng)給出初始化值
int[] arr = new int[5];
b:靜態(tài)初始化 給出初始化值,由系統(tǒng)決定長度
C:動(dòng)態(tài)初始化的格式:
數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];
D:案例演示
-
輸出數(shù)組名稱和數(shù)組元素
整數(shù)類型: byte,short,int ,long 默認(rèn)初始化值都是0 浮點(diǎn)類型: float,double默認(rèn)初始化值都是0.0 布爾類型: boolean默認(rèn)初始化值是false 字符類型: char 默認(rèn)初始化值是'\u0000'【char在內(nèi)存中占兩個(gè)字節(jié),是16個(gè)二進(jìn)制位,\u0000,,每個(gè)0都代表16進(jìn)制的0,那么 四個(gè)0就代表16個(gè)二進(jìn)制位】
Java中的內(nèi)存分配以及棧和堆的區(qū)別
A:棧(掌握) (先進(jìn)后出, 相當(dāng)于搶里的子彈): 存儲(chǔ)局部變量 【局部變量: 定義在方法聲明上和方法中的變量】
B:堆(掌握) : 存儲(chǔ)new出來的數(shù)組或?qū)ο?/p>
C:方法區(qū): 面向?qū)ο蟛糠种v解
D:本地方法區(qū): 和系統(tǒng)相關(guān)
E:寄存器: 給CPU使用
注意:
a:局部變量 在方法定義中或者方法聲明上定義的變量。
b:棧內(nèi)存和堆內(nèi)存的區(qū)別
棧:數(shù)據(jù)使用完畢,就消失。
堆:每一個(gè)new出來的東西都有地址
每一個(gè)變量都有默認(rèn)值
byte,short,int,long 0
float,double 0.0
char '\u0000'
boolean false
引用類型 null
數(shù)據(jù)使用完畢后,在垃圾回收器空閑的時(shí)候回收。
數(shù)組的初始化靜態(tài)初始化及內(nèi)存圖
- A:靜態(tài)初始化的格式:
- 格式:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{元素1,元素2,…};
- 簡化格式:聲明和賦值在同一行
- 數(shù)據(jù)類型[] 數(shù)組名 = {元素1,元素2,…};
- B:案例演示
- 對(duì)數(shù)組的解釋
- 輸出數(shù)組名稱和數(shù)組元素
- C:畫圖演示
- 一個(gè)數(shù)組
數(shù)組越界和空指針
- a:ArrayIndexOutOfBoundsException:數(shù)組索引越界異常
- 原因:你訪問了不存在的索引。
- b:NullPointerException:空指針異常
- 原因:數(shù)組已經(jīng)不在指向堆內(nèi)存了。而你還用數(shù)組名去訪問元素。
int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
數(shù)組遍歷
- 數(shù)組遍歷:就是依次輸出數(shù)組中的每一個(gè)元素。
- 數(shù)組的屬性:arr.length數(shù)組的長度
- 數(shù)組的最大索引: arr.length - 1;
public static void print(int[] arr) {
for (int i = 0;i < arr.length ;i++ ) {
System.out.print(arr[i] + " ");
}
}
數(shù)組獲取最值
- 數(shù)組獲取最值(獲取數(shù)組中的最大值最小值)
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1;i < arr.length ;i++ ) { //從數(shù)組的第二個(gè) 元素開始遍歷
if (max < arr[i]) { //如果max記錄的值小于的數(shù)組中的元素
max = arr[i]; //max記錄住較大的
}
}
return max;
}
數(shù)組反轉(zhuǎn)
- 數(shù)組元素反轉(zhuǎn)(就是把元素對(duì)調(diào))
// 1. 明確返回值類型void
// 2. 明確參數(shù)列表int[] arr
public static void reverseArray(int[] arr) {
for (int i = 0;i < arr.length / 2 ; i++) {
//arr[0]和arr[arr.length-1-0]交換
//arr[1]和arr[arr.length-1-1]交換
//arr[2]和arr[arr.lentth-1-2]
//...
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
}
數(shù)組查表法
- 數(shù)組查表法(根據(jù)鍵盤錄入索引,查找對(duì)應(yīng)星期)
public static char getWeek(int week) {
char[] arr = {' ','一','二','三','四','五','六','日'}; //定義了一張星期表
return arr[week]; //通過索引獲取表中的元素
}
數(shù)組基本查找
- 數(shù)組元素查找(查找指定元素第一次在數(shù)組中出現(xiàn)的索引)
public static int getIndex(int[] arr,int value) {
for (int i = 0;i < arr.length ;i++ ) { //數(shù)組的遍歷
if (arr[i] == value) { //如果數(shù) 組中的元素與查找的元素匹配
return i;
}
}
return -1;
}
二維數(shù)組概述和格式
A:二維數(shù)組格式1
數(shù)據(jù)類型[][] 數(shù)組名 = new 數(shù)據(jù)類型[m][n];
int[][] arr = new int[3][2]; 【 二維數(shù)組中有3個(gè)一維數(shù)組,每個(gè)數(shù)組中有2個(gè)元素】
B:二維數(shù)組格式1的解釋
C:注意事項(xiàng)
a:以下格式也可以表示二維數(shù)組
1:數(shù)據(jù)類型 數(shù)組名[][] = new 數(shù)據(jù)類型[m][n];
2:數(shù)據(jù)類型[] 數(shù)組名[] = new 數(shù)據(jù)類型[m][n];
-
B:注意下面定義的區(qū)別
int x;
int y;
int x,y;int[] x; int[] y[]; int[] x,y[]; x是一維數(shù)組,y是二維數(shù)組
二維數(shù)組遍歷
外循環(huán)控制的是二維數(shù)組的長度,其實(shí)就是一維數(shù)組的個(gè)數(shù)。
-
內(nèi)循環(huán)控制的是一維數(shù)組的長度。
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}}; for (int i = 0;i < arr.length ;i++ ) { //獲取到每個(gè)二維數(shù)組中的一維數(shù)組 for (int j = 0;j < arr[i].length ;j++ ) { //獲取每個(gè)一維數(shù)組中的元素 System.out.print(arr[i][j] + " "); } System.out.println(); }
Java中的參數(shù)傳遞問題及圖解
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b);
change(a,b);
System.out.println("a:"+a+",b:"+b);
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]);
}
public static void change(int a,int b) {
System.out.println("a:"+a+",b:"+b);
a = b;
b = a + b;
System.out.println("a:"+a+",b:"+b);
}
public static void change(int[] arr) {
for(int x=0; x<arr.length; x++) {
if(arr[x]%2==0) {
arr[x]*=2;
}
}
}
基本數(shù)據(jù)類型的值傳遞,不改變原值,因?yàn)檎{(diào)用后就會(huì)彈棧,局部變量隨之消失
引用數(shù)據(jù)類型的值傳遞,改變原值,因?yàn)榧词狗椒◤棗?,但是堆?nèi)層數(shù)組對(duì)象還在,可以通過地址繼續(xù)訪問
Java中到底是傳值還是傳址
java中只有傳值, 因?yàn)榈刂分狄彩侵担ㄖС终吒咚玖?---java)
面向?qū)ο筇卣?/h5>
- 封裝(encapsulation)
- 繼承(inheritance)
- 多態(tài)(polymorphism)
面向?qū)ο笈c面向過程的區(qū)別
- 面向?qū)ο?
- 找回?cái)偧屣灥睦洗髬?老大媽包含: 攤煎餅的技術(shù),做煎 餅)
- 給錢
- 吃
- 面向過程:
- 學(xué)習(xí)攤煎餅的技術(shù)
- 買材料薄脆,油,面粉....
- 開始攤
- 吃
- 收拾
類和對(duì)象的概念
- a:類:是一組相關(guān)的屬性和行為的集合
- b:對(duì)象:是該類事物的具體體現(xiàn)
- 我們?nèi)绾蚊枋霈F(xiàn)實(shí)世界事物
- 屬性 就是該事物的描述信息(事物身上的名詞)
- 行為 就是該事物能夠做什么(事物身上的動(dòng)詞)
- Java中最基本的單位是類,Java中用class描述事物也是如此
- 成員變量 就是事物的屬性
- 成員方法 就是事物的行為
如何使用對(duì)象?
- 創(chuàng)建對(duì)象并使用
- 格式:類名 對(duì)象名 = new 類名();
- 對(duì)象名: 其實(shí)就是標(biāo)準(zhǔn)的標(biāo)識(shí)符,如果是一個(gè)單詞所有字母小寫,如果是多個(gè)單詞, 從第二個(gè)的單詞開始首字母大寫
- 如何使用成員變量呢?
- 對(duì)象名.變量名
- 如何使用成員方法呢?
- 對(duì)象名.方法名(...)
一個(gè)對(duì)象的內(nèi)存圖
二個(gè)對(duì)象
二個(gè)對(duì)象的內(nèi)存圖
三個(gè)引用兩個(gè)對(duì)象的內(nèi)存圖
成員變量和局部變量的區(qū)別
A:在類中的位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
B:在內(nèi)存中的位置不同
成員變量:在堆內(nèi)存(成員變量屬于對(duì)象,對(duì)象進(jìn)堆內(nèi)存)
局部變量:在棧內(nèi)存(局部變量屬于方法,方法進(jìn)棧內(nèi)存)
C:生命周期不同
成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
局部變量:隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失
D:初始化值不同
成員變量:有默認(rèn)初始化值
局部變量:沒有默認(rèn)初始化值,必須定義,賦值,然后才能使用。
注意事項(xiàng):
局部變量名稱可以和成員變量名稱一樣,在方法中使用的時(shí)候,采用的是就近原則。
基本數(shù)據(jù)類型變量包括哪些:byte,short,int,long,float,double,boolean,char
引用數(shù)據(jù)類型變量包括哪些:數(shù)組,類,接口,枚舉
方法的形式參數(shù)是類名的時(shí)候如何調(diào)用
- A:方法的參數(shù)是類名public void print(Student s){}//print(new Student());
-
如果你看到了一個(gè)方法的形式參數(shù)是一個(gè)類類型(引用類型),這里其實(shí)需要的是該類的對(duì)象。
形式參數(shù)
匿名對(duì)象的概述和應(yīng)用
- A:什么是匿名對(duì)象
- 沒有名字的對(duì)象
- B:匿名對(duì)象應(yīng)用場景
- a:調(diào)用方法,僅僅只調(diào)用一次的時(shí)候。
- 那么,這種匿名調(diào)用有什么好處嗎?
- 節(jié)省代碼
- 注意:調(diào)用多次的時(shí)候,不適合。匿名對(duì)象調(diào)用完畢就是垃圾??梢员焕厥掌骰厥?。
- b:匿名對(duì)象可以作為實(shí)際參數(shù)傳遞
-
C:匿名對(duì)象可以調(diào)用屬性, 但是沒有意義,因?yàn)檎{(diào)用后就變成了垃圾,如果需要賦值的還是使用有名字的對(duì)象
封裝的概述
A:封裝概述
是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問方式。
B:封裝好處
隱藏實(shí)現(xiàn)細(xì)節(jié),提供公共的訪問方式
提高了代碼的復(fù)用性
提高安全性。
C:封裝原則
將不需要對(duì)外提供的內(nèi)容都隱藏起來。
把屬性隱藏,提供公共方法對(duì)其訪問。
private關(guān)鍵字的概述和特點(diǎn)
- A:private關(guān)鍵字特點(diǎn)
- a:是一個(gè)權(quán)限修飾符
- b:可以修飾成員變量和成員方法
- c:被其修飾的成員只能在本類中被訪問
- B:案例演示
- 封裝和private的應(yīng)用:
- a:把成員變量用private修飾
- b:提供對(duì)應(yīng)的getXxx()和setXxx()方法
- private僅僅是封裝的一種體現(xiàn)形式,不能說封裝就是私有
this關(guān)鍵字的概述和應(yīng)用
- A:this關(guān)鍵字特點(diǎn)
- 代表當(dāng)前對(duì)象的引用
- B:案例演示
- this的應(yīng)用場景
- 用來區(qū)分成員變量和局部變量重名
構(gòu)造方法Constructor概述和格式
- A:構(gòu)造方法概述和作用
- 給對(duì)象的數(shù)據(jù)(屬性)進(jìn)行初始化
- B:構(gòu)造方法格式特點(diǎn)
- a:方法名與類名相同(大小也要與類名一致)
- b:沒有返回值類型,連void都沒有
- c:沒有具體的返回值return;
構(gòu)造方法的重載及注意事項(xiàng)
- A:案例演示
- 構(gòu)造方法的重載
- 重載:方法名相同,與返回值類型無關(guān)(構(gòu)造方法沒有返回值),只看參數(shù)列表
- B:構(gòu)造方法注意事項(xiàng)
- a:如果我們沒有給出構(gòu)造方法,系統(tǒng)將自動(dòng)提供一個(gè)無參構(gòu)造方法。
- b:如果我們給出了構(gòu)造方法,系統(tǒng)將不再提供默認(rèn)的無參構(gòu)造方法。
- 注意:這個(gè)時(shí)候,如果我們還想使用無參構(gòu)造方法,就必須自己給出。建議永遠(yuǎn)自己給出無參構(gòu)造方法
給成員變量賦值的兩種方式的區(qū)別
- A:setXxx()方法
- 修改屬性值
- B:構(gòu)造方法
-
給對(duì)象中屬性進(jìn)行初始化
給成員變量賦值的兩種方式
- C:給成員變量賦值:
- a:setXxx()方法
- b:構(gòu)造方法
- D:輸出成員變量值的方式:
- a:通過getXxx()分別獲取然后拼接
- b:通過調(diào)用show()方法搞定
畫圖說明一個(gè)對(duì)象的創(chuàng)建過程做了哪些事情?
-
Student s = new Student();
1,Student.class加載進(jìn)內(nèi)存
2,聲明一個(gè)Student類型引用s
3,在堆內(nèi)存創(chuàng)建對(duì)象,
4,給對(duì)象中屬性默認(rèn)初始化值
5,屬性進(jìn)行顯示初始化
6,構(gòu)造方法進(jìn)棧,對(duì)對(duì)象中的屬性賦值,構(gòu)造方法彈棧
7,將對(duì)象的地址值賦值給s
對(duì)象的創(chuàng)建過程
static關(guān)鍵字及內(nèi)存圖
不帶static內(nèi)存圖
帶static內(nèi)存圖
static關(guān)鍵字的特點(diǎn)
- a:隨著類的加載而加載
- b:優(yōu)先于對(duì)象存在
- c:被類的所有對(duì)象共享
- 舉例:咱們班級(jí)的學(xué)生應(yīng)該共用同一個(gè)班級(jí)編號(hào)。
- 其實(shí)這個(gè)特點(diǎn)也是在告訴我們什么時(shí)候使用靜態(tài)?
- 如果某個(gè)成員變量是被所有對(duì)象共享的,那么它就應(yīng)該定義為靜態(tài)的。
- 舉例:
- 飲水機(jī)(用靜態(tài)修飾)
- 水杯(不能用靜態(tài)修飾)
- 共性用靜態(tài),特性用非靜態(tài)
- d:可以通過類名調(diào)用
- 其實(shí)它本身也可以通過對(duì)象名調(diào)用。
- 推薦使用類名調(diào)用。
- 靜態(tài)修飾的內(nèi)容一般我們稱其為:與類相關(guān)的,類成員
static的注意事項(xiàng)
- a:在靜態(tài)方法中是沒有this關(guān)鍵字的
- 如何理解呢?
- 靜態(tài)是隨著類的加載而加載,this是隨著對(duì)象的創(chuàng)建而存在。
- 靜態(tài)比對(duì)象先存在。
- b:靜態(tài)方法只能訪問靜態(tài)的成員變量和靜態(tài)的成員方法
- 靜態(tài)方法:
- 成員變量:只能訪問靜態(tài)變量
- 成員方法:只能訪問靜態(tài)成員方法
- 非靜態(tài)方法:
- 成員變量:可以是靜態(tài)的,也可以是非靜態(tài)的
- 成員方法:可是是靜態(tài)的成員方法,也可以是非靜態(tài)的成員方法。
- 簡單記:
- 靜態(tài)只能訪問靜態(tài)。
靜態(tài)變量和成員變量的區(qū)別
- 靜態(tài)變量也叫類變量 成員變量也叫對(duì)象變量
- A:所屬不同
- 靜態(tài)變量屬于類,所以也稱為為類變量
- 成員變量屬于對(duì)象,所以也稱為實(shí)例變量(對(duì)象變量)
- B:內(nèi)存中位置不同
- 靜態(tài)變量存儲(chǔ)于方法區(qū)的靜態(tài)區(qū)
- 成員變量存儲(chǔ)于堆內(nèi)存
- C:內(nèi)存出現(xiàn)時(shí)間不同
- 靜態(tài)變量隨著類的加載而加載,隨著類的消失而消失
- 成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
- D:調(diào)用不同
- 靜態(tài)變量可以通過類名調(diào)用,也可以通過對(duì)象調(diào)用
- 成員變量只能通過對(duì) 象名調(diào)用
main方法的格式詳細(xì)解釋
- public 被jvm調(diào)用,訪問權(quán)限足夠大。
- static 被jvm調(diào)用,不用創(chuàng)建對(duì)象,直接類名訪問
- void 被jvm調(diào)用,不需要給jvm返回值
- main 一個(gè)通用的名稱,雖然不是關(guān)鍵字,但是被jvm識(shí)別
- String[] args 以前用于接收鍵盤錄入的
工具類中使用靜態(tài)
- 如果一個(gè)類中所有的方法都是靜態(tài)的,需要再多做一步,私有構(gòu)造方法,目的是不讓其他類創(chuàng)建本類對(duì)象
- 直接用類名.調(diào)用即可
Math類的隨機(jī)數(shù)功能
- A:Math類概述
- 類包含用于執(zhí)行基本數(shù)學(xué)運(yùn)算的方法
- B:Math類特點(diǎn)
- 由于Math類在java.lang包下,所以不需要導(dǎo)包。
- 因?yàn)樗某蓡T全部是靜態(tài)的,所以私有了構(gòu)造方法
- C:獲取隨機(jī)數(shù)的方法
- public static double random():返回帶正號(hào)的 double 值,該值大于等于 0.0 且小于 1.0。
- D:我要獲取一個(gè)1-100之間的隨機(jī)數(shù),腫么辦?
- int number = (int)(Math.random()*100)+1;
代碼塊的概述和分類
- A:代碼塊概述
- 在Java中,使用{}括起來的代碼被稱為代碼塊。
- B:代碼塊分類
- 根據(jù)其位置和聲明的不同,可以分為局部代碼塊,構(gòu)造代碼塊,靜態(tài)代碼塊,同步代碼塊(多線程講解)。
- C:常見代碼塊的應(yīng)用
- a:局部代碼塊
- 在方法中出現(xiàn);限定變量生命周期,及早釋放,提高內(nèi)存利用率
- b:構(gòu)造代碼塊 (初始化塊)
- 在類中方法外出現(xiàn);多個(gè)構(gòu)造方法方法中相同的代碼存放到一起,每次調(diào)用構(gòu)造都執(zhí)行(每創(chuàng)建一次對(duì)象就會(huì)執(zhí)行一次),并且在構(gòu)造方法前執(zhí)行(優(yōu)先構(gòu)造函數(shù)執(zhí)行)
- c:靜態(tài)代碼塊
- 在類中方法外出現(xiàn),并加上static修飾;用于給類進(jìn)行初始化,在加載的時(shí)候就執(zhí)行,并且只執(zhí)行一次。(優(yōu)先于主方法執(zhí)行)
- 一般用于加載驅(qū)動(dòng)
代碼塊的面試題
class Student {
static {
System.out.println("Student 靜態(tài)代碼塊");
}
{
System.out.println("Student 構(gòu)造代碼塊");
}
public Student() {
System.out.println("Student 構(gòu)造方法");
}
}
class Demo2_Student {
static {
System.out.println("Demo2_Student靜態(tài)代碼塊");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
輸出》》》》
我是main方法
Student 靜態(tài)代碼塊
Student 構(gòu)造代碼塊
Student 構(gòu)造方法
Student 構(gòu)造代碼塊
Student 構(gòu)造方法
繼承好處和弊端
A:繼承的好處
a:提高了代碼的復(fù)用性
b:提高了代碼的維護(hù)性
c:讓類與類之間產(chǎn)生了關(guān)系,是多態(tài)的前提
B:繼承的弊端
類的耦合性增強(qiáng)了。
開發(fā)的原則:高內(nèi)聚,低耦合。
耦合:類與類的關(guān)系
內(nèi)聚:就是自己完成某件事情的能力
Java中類的繼承特點(diǎn)
- A:Java中類的繼承特點(diǎn)
- a:Java只支持單繼承,不支持多繼承。(一個(gè)兒子只能有一個(gè)爹)
- 有些語言是支持多繼承,格式:extends 類1,類2,...
- b:Java支持多層繼承(繼承體系)
- B:案例演示
- Java中類的繼承特點(diǎn)
- 如果想用這個(gè)體系的所有功能用最底層的類創(chuàng)建對(duì)象
- 如果想看這個(gè)體系的共性功能,看最頂層的類
繼承的注意事項(xiàng)和什么時(shí)候使用繼承
- A:繼承的注意事項(xiàng)
- a:子類只能繼承父類所有非私有的成員(成員方法和成員變量)
- b:子類不能繼承父類的構(gòu)造方法,但是可以通過super(馬上講)關(guān)鍵字去訪問父類構(gòu)造方法。
- c:不要為了部分功能而去繼承
- 項(xiàng)目經(jīng)理 姓名 工號(hào) 工資 獎(jiǎng)金
- 程序員 姓名 工號(hào) 工資
- B:什么時(shí)候使用繼承
- 繼承其實(shí)體現(xiàn)的是一種關(guān)系:"is a"。
Person
Student
Teacher
水果
蘋果
香蕉
橘子
- 找回?cái)偧屣灥睦洗髬?老大媽包含: 攤煎餅的技術(shù),做煎 餅)
- 給錢
- 吃
- 學(xué)習(xí)攤煎餅的技術(shù)
- 買材料薄脆,油,面粉....
- 開始攤
- 吃
- 收拾
A:在類中的位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
B:在內(nèi)存中的位置不同
成員變量:在堆內(nèi)存(成員變量屬于對(duì)象,對(duì)象進(jìn)堆內(nèi)存)
局部變量:在棧內(nèi)存(局部變量屬于方法,方法進(jìn)棧內(nèi)存)
C:生命周期不同
成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
局部變量:隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失
D:初始化值不同
成員變量:有默認(rèn)初始化值
局部變量:沒有默認(rèn)初始化值,必須定義,賦值,然后才能使用。
注意事項(xiàng):
局部變量名稱可以和成員變量名稱一樣,在方法中使用的時(shí)候,采用的是就近原則。
基本數(shù)據(jù)類型變量包括哪些:byte,short,int,long,float,double,boolean,char
引用數(shù)據(jù)類型變量包括哪些:數(shù)組,類,接口,枚舉
如果你看到了一個(gè)方法的形式參數(shù)是一個(gè)類類型(引用類型),這里其實(shí)需要的是該類的對(duì)象。
C:匿名對(duì)象可以調(diào)用屬性, 但是沒有意義,因?yàn)檎{(diào)用后就變成了垃圾,如果需要賦值的還是使用有名字的對(duì)象
A:封裝概述
是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問方式。
B:封裝好處
隱藏實(shí)現(xiàn)細(xì)節(jié),提供公共的訪問方式
提高了代碼的復(fù)用性
提高安全性。
C:封裝原則
將不需要對(duì)外提供的內(nèi)容都隱藏起來。
把屬性隱藏,提供公共方法對(duì)其訪問。
- 給對(duì)象的數(shù)據(jù)(屬性)進(jìn)行初始化
- a:方法名與類名相同(大小也要與類名一致)
- b:沒有返回值類型,連void都沒有
- c:沒有具體的返回值return;
給對(duì)象中屬性進(jìn)行初始化
Student s = new Student();
1,Student.class加載進(jìn)內(nèi)存
2,聲明一個(gè)Student類型引用s
3,在堆內(nèi)存創(chuàng)建對(duì)象,
4,給對(duì)象中屬性默認(rèn)初始化值
5,屬性進(jìn)行顯示初始化
6,構(gòu)造方法進(jìn)棧,對(duì)對(duì)象中的屬性賦值,構(gòu)造方法彈棧
7,將對(duì)象的地址值賦值給s
- 舉例:咱們班級(jí)的學(xué)生應(yīng)該共用同一個(gè)班級(jí)編號(hào)。
- 其實(shí)這個(gè)特點(diǎn)也是在告訴我們什么時(shí)候使用靜態(tài)?
- 如果某個(gè)成員變量是被所有對(duì)象共享的,那么它就應(yīng)該定義為靜態(tài)的。
- 舉例:
- 飲水機(jī)(用靜態(tài)修飾)
- 靜態(tài)是隨著類的加載而加載,this是隨著對(duì)象的創(chuàng)建而存在。
- 靜態(tài)比對(duì)象先存在。
- 成員變量:只能訪問靜態(tài)變量
- 成員方法:只能訪問靜態(tài)成員方法
- 成員變量:可以是靜態(tài)的,也可以是非靜態(tài)的
- 成員方法:可是是靜態(tài)的成員方法,也可以是非靜態(tài)的成員方法。
- 靜態(tài)只能訪問靜態(tài)。
class Student {
static {
System.out.println("Student 靜態(tài)代碼塊");
}
{
System.out.println("Student 構(gòu)造代碼塊");
}
public Student() {
System.out.println("Student 構(gòu)造方法");
}
}
class Demo2_Student {
static {
System.out.println("Demo2_Student靜態(tài)代碼塊");
}
public static void main(String[] args) {
System.out.println("我是main方法");
Student s1 = new Student();
Student s2 = new Student();
}
}
輸出》》》》
我是main方法
Student 靜態(tài)代碼塊
Student 構(gòu)造代碼塊
Student 構(gòu)造方法
Student 構(gòu)造代碼塊
Student 構(gòu)造方法
A:繼承的好處
a:提高了代碼的復(fù)用性
b:提高了代碼的維護(hù)性
c:讓類與類之間產(chǎn)生了關(guān)系,是多態(tài)的前提
B:繼承的弊端
類的耦合性增強(qiáng)了。
開發(fā)的原則:高內(nèi)聚,低耦合。
耦合:類與類的關(guān)系
內(nèi)聚:就是自己完成某件事情的能力
Person
Student
Teacher
水果
蘋果
香蕉
橘子
采用假設(shè)法。
如果有兩個(gè)類A,B。只有他們符合A是B的一種,或者B是A的一種,就可以考慮使用繼承。
this和super的區(qū)別和應(yīng)用
- A:this和super都代表什么
- this:代表當(dāng)前對(duì)象的引用,誰來調(diào)用我,我就代表誰
- super:代表當(dāng)前對(duì)象父類的引用
- B:this和super的使用區(qū)別
- a:調(diào)用成員變量
- this.成員變量 調(diào)用本類的成員變量,也可以調(diào)用父類的成員變量
- super.成員變量 調(diào)用父類的成員變量
- b:調(diào)用構(gòu)造方法
- this(...) 調(diào)用本類的構(gòu)造方法
- super(...) 調(diào)用父類的構(gòu)造方法
- c:調(diào)用成員方法
- this.成員方法 調(diào)用本類的成員方法,也可以調(diào)用父類的方法
- super.成員方法 調(diào)用父類的成員方法
繼承中構(gòu)造方法的關(guān)系
A:子類中所有的構(gòu)造方法默認(rèn)都會(huì)訪問父類中空參數(shù)的構(gòu)造方法
B:為什么呢?
因?yàn)樽宇悤?huì)繼承父類中的數(shù)據(jù),可能還會(huì)使用父類的數(shù)據(jù)。
所以,子類初始化之前,一定要先完成父類數(shù)據(jù)的初始化。
其實(shí):
-
每一個(gè)構(gòu)造方法的第一條語句默認(rèn)都是:super() Object類最頂層的父類。
繼承中構(gòu)造方法的注意事項(xiàng)
- A:父類沒有無參構(gòu)造方法,子類怎么辦?
- super解決
- this解決
- B:注意事項(xiàng)
- super(…)或者this(….)必須出現(xiàn)在構(gòu)造方法的第一條語句上
方法重寫
- A:什么是方法重寫
- 重寫:子父類出現(xiàn)了一模一樣的方法(注意:返回值類型可以是子父類,這個(gè)我們學(xué)完面向?qū)ο笾v)
- B:方法重寫的應(yīng)用:
- 當(dāng)子類需要父類的功能,而功能主體子類有自己特有內(nèi)容時(shí),可以重寫父類中的方法。這樣,即沿襲了父類的功能,又定義了子類特有的內(nèi)容。
方法重寫的注意事項(xiàng)
A:方法重寫注意事項(xiàng)
a:父類中私有方法不能被重寫
因?yàn)楦割愃接蟹椒ㄗ宇惛揪蜔o法繼承
b:子類重寫父類方法時(shí),訪問權(quán)限不能更低
最好就一致
c:父類靜態(tài)方法,子類也必須通過靜態(tài)方法進(jìn)行重寫
其實(shí)這個(gè)算不上方法重寫,但是現(xiàn)象確實(shí)如此,至于為什么算不上方法重寫,多態(tài)中我會(huì)講解(靜態(tài)只能覆蓋靜態(tài))
子類重寫父類方法的時(shí)候,最好聲明一模一樣。
方法重寫的面試題
Override和Overload的區(qū)別?Overload能改變返回值類型嗎?
overload可以改變返回值類型,只看參數(shù)列表
方法重寫:子類中出現(xiàn)了和父類中方法聲明一模一樣的方法。與返回值類型有關(guān),返回值是一致(或者是子父類)的
方法重載:本類中出現(xiàn)的方法名一樣,參數(shù)列表不同的方法。與返回值類型無關(guān)。
子類對(duì)象調(diào)用方法的時(shí)候:
先找子類本身,再找父類。
final關(guān)鍵字修飾類,方法以及變量的特點(diǎn)
- A:final概述
- B:final修飾特點(diǎn)
- 修飾類,類不能被繼承
- 修飾變量,變量就變成了常量,只能被賦值一次
- 修飾方法,方法不能被重寫
final關(guān)鍵字修飾局部變量
- 基本類型,是值不能被改變
- 引用類型,是地址值不能被改變,對(duì)象中的屬性可以改變
final修飾變量的初始化時(shí)機(jī)
- 顯示初始化
- 在對(duì)象構(gòu)造完畢前即可
class Demo3_Final {
public static void main(String[] args) {
Demo d = new Demo();
d.print();
}
}
class Demo {
final int num; //成員變量的默認(rèn)初始化值是無效值
public Demo() {
num = 10;
}
public void print() {
System.out.println(num);
}
}
多態(tài)的概述及其代碼體現(xiàn)
- A:多態(tài)(polymorphic)概述
- 事務(wù)存在的多種形態(tài)
- B:多態(tài)的前提
- a要有繼承關(guān)系
- b:要有方法重寫
- c:要有父類引用指向子類對(duì)象
多態(tài)中的成員訪問特點(diǎn)之成員變量
多態(tài)中的成員訪問特點(diǎn)之成員變量)
- 成員變量
-
編譯看左邊(父類), 運(yùn)行看左邊(父類
多態(tài)中的成員訪問特點(diǎn)之成員方法
- 成員方法
- 編譯看左邊(父類), 運(yùn)行看右邊(子類)
多態(tài)中的成員訪問特點(diǎn)之靜態(tài)成員方法
- 靜態(tài)方法
- 編譯看左邊(父類), 運(yùn)行看左邊(父類)
- (靜態(tài)和類相關(guān), 算不上重寫, 所以, 訪問訪問還是看左邊)
- 只有非靜態(tài)的成員方法, 編譯看左邊 , 運(yùn)行看左邊
超人故事
多態(tài)中向上轉(zhuǎn)型和向下轉(zhuǎn)型
- Personn p = new SuperMan(); 向上轉(zhuǎn)型
-
SuperMan sm = (SuperMan)p; 向下轉(zhuǎn)型
多態(tài)的好處和弊端
- A:多態(tài)的好處
- a:提高了代碼的維護(hù)性(繼承保證)
- b:提高了代碼的擴(kuò)展性(由多態(tài)保證)
- B:案例演示
- 多態(tài)的好處
- 可以單子形式參數(shù), 可以接受任意子類對(duì)象
- C:多態(tài)的弊端
- 不能使用子類的特有屬性和行為
-
D:案例提示
method(Animal a)
method(Cat c)
多態(tài)的題目分析題
A:看下面程序是否有問題, 如果沒有, 說出結(jié)果
class Fu {
public void show() {
System.out.println("Fu show");
}
}
class Zi extends Fu {
public void show() {
System.out.println("Zi show");
}
public void method() {
System.out.println("Zi method");
}
}
class Test1Demo {
public static void main(String[] args) {
Fu f = new Zi();
f.method(); //-----有問題,編譯出問題, 父類Fu中沒有method方法
f.show(); //--------沒問題,輸出 Zi show; 當(dāng)子類Zi中沒有自己的show方法時(shí),編譯仍然正確,是輸出Fu show
}
}-
B:看下面程序是否有問題, 如果沒有, 說出結(jié)果
class A {
public void show() {
show2();
}
public void show2() {
System.out.println("我");
}
}
class B extends A {
public void show2() {
System.out.println("愛");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("你");
}
}
class Test2DuoTai {
public static void main(String[] args) {
A a = new B();
a.show(); // ------------愛B b = new C(); b.show(); // ------------你 } }
抽象類的概述及特點(diǎn)
- A:抽象類的概述
- 抽象類就是看不懂的
- B:抽象類的特點(diǎn)
- a:抽象類和抽象方法必須用abstract關(guān)鍵字修飾
- abstract class 類名 {}
- b:抽象類不一定有抽象方法, 有抽象方法的類一定是抽象類或者是接口
- c:抽象類不能實(shí)例化那么, 抽象類然后實(shí)例化呢?
- 按照多態(tài)的方式, 由具體的子類實(shí)例化. 其實(shí)這也是多態(tài)的一種, 抽象類多態(tài)
- d:抽象類的子類
- 要么是抽象類
- 要么重寫抽象類中的所有抽象方法
抽象類的成員特點(diǎn)
- A:抽象類的成員特點(diǎn)
- a:成員變量:既可以是變量,也可以是常量。abstractshift可以修飾成員變量?不能修飾成員變量
- b:構(gòu)造方法: 有
- 用子類訪問父類數(shù)據(jù)的初始化
- c:成員方法:既可以是抽象的,也可以是非抽象的
- B:案例演示
- 抽象類的成員特點(diǎn)
- C:抽象類的成員方法特性:
- a:抽象方法 強(qiáng)制要求子類做的事情
- b:非抽象方法 子類繼承的事情, 提高代碼復(fù)用性
abstract不能和那些關(guān)鍵字共存
接口的概述及其特點(diǎn)
A:接口的概述
從俠義的角度講就是指java 中的interface
從廣義的校對(duì)講對(duì)外提供規(guī)則的都是接口
B:接口的特點(diǎn)
a:接口用關(guān)鍵字interface表示
b:類實(shí)現(xiàn)接口用implement表示
class 類名 implement 接口名 {}
c:接口不能被實(shí)例化
那么,接口如何實(shí)例化呢?
按照多態(tài)的方式來實(shí)例化
d:接口的子類
可以是抽象類,但意義不大
可以是具體類,要重寫接口中的所有抽象方法
子類重寫父類方法的時(shí)候,最好聲明一模一樣。
接口的成員特點(diǎn)
- 成員變量: 只能是常量,并且是靜態(tài)的、公共的
- 默認(rèn)修私符: public static final
- 建議 : 自己動(dòng)手給出
- 構(gòu)造方法:接口沒有構(gòu)造方法
- 成員方法:只能是抽象方法
- 默認(rèn)修私符: public abstract
- 建議 : 自己動(dòng)手給出
類與類、類與接口、接口與接口的關(guān)系
- a:類與類
- 繼承關(guān)系: 只能單繼承, 可以多層繼承
- b:類與接口
- 實(shí)習(xí)關(guān)系:可以單實(shí)現(xiàn)、也可以多實(shí)現(xiàn)
- 并且還可以在繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口
- c:接口與接口
- 繼承關(guān)系:可以單繼承,也可以對(duì)繼承
抽象類與接口的區(qū)別
A:成員區(qū)別
抽象類:
成員變量: 可以是變量,也可以是常量
構(gòu)造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量: 只能是常量
構(gòu)造方法:無
成員方法:只可以抽象
B:關(guān)系區(qū)別
類與類:
繼承,單繼承
類與接口:
實(shí)現(xiàn),單實(shí)習(xí),多實(shí)現(xiàn)
接口與接口
繼承,單繼承,多繼承
c:設(shè)計(jì)理念區(qū)別
抽象類 被繼承體現(xiàn)的是:“is a”的關(guān)系,抽象類中定義的是該繼承依稀的共性功能
接口 被實(shí)現(xiàn)體現(xiàn)的是:“l(fā)ike a”的關(guān)系, 接口中定義的是該繼承體系的擴(kuò)展功能
如何編譯運(yùn)行帶包的類
- a:javac編譯的時(shí)候帶上-d即可
- javac -d . HelloWorld.java
- b:通過java命令執(zhí)行。
- java 包名.HellWord
四種權(quán)限修飾符
本類 同一個(gè)包下(子類和無關(guān)類) 不同包下(子類) 不同包下(無關(guān)類)
private Y
默認(rèn) Y Y
protected Y Y Y
public Y Y Y Y
類及其組成所使用的常見修飾符
- A:修飾符:
- 權(quán)限修飾符:private,默認(rèn)的,protected,public
- 狀態(tài)修飾符:static,final
- 抽象修飾符:abstract
- B:類:
- 權(quán)限修飾符:默認(rèn)修飾符,public
- 狀態(tài)修飾符:final
- 抽象修飾符:abstract
- 用的最多的就是:public
- C:成員變量:
- 權(quán)限修飾符:private,默認(rèn)的,protected,public
- 狀態(tài)修飾符:static,final
- 用的最多的就是:private
- D:構(gòu)造方法:
- 權(quán)限修飾符:private,默認(rèn)的,protected,public
- 用的最多的就是:public
- E:成員方法:
- 權(quán)限修飾符:private,默認(rèn)的,protected,public
- 狀態(tài)修飾符:static,final
- 抽象修飾符:abstract
- 用的最多的就是:public
- F:除此以外的組合規(guī)則:
- 成員變量:public static final
- 成員方法:
- public static
- public abstract
- public final
內(nèi)部類概述和訪問特點(diǎn)
- a:內(nèi)部類可以直接訪問外部類的成員,包括私有。
- b:外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對(duì)象。
- 外部類名.內(nèi)部類名 對(duì)象名 = 外部類對(duì)象.內(nèi)部類對(duì)象;
class Demo1_InnerClass {
public static void main(String[] args) {
//Inner i = new Inner();
//i.method();
//外部類名.內(nèi)部類名 = 外部類對(duì)象.內(nèi)部類對(duì)象
Outer.Inner oi = new Outer().new Inner(); //創(chuàng)建內(nèi)部類對(duì)象
oi.method();
}
}
class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}
成員內(nèi)部類私有使用
class Demo2_InnerClass {
public static void main(String[] args) {
//Outer.Inner oi = new Outer().new Inner();
//oi.method();
Outer o = new Outer();
o.print();
}
}
class Outer {
private int num = 10;
private class Inner {
public void method() {
System.out.println(num);
}
}
public void print() {
Inner i = new Inner();
i.method();
}
}
靜態(tài)成員內(nèi)部類
- 成員內(nèi)部類被靜態(tài)修飾后的訪問方式是: 外部類名.內(nèi)部類名 對(duì)象名 = 外部類名.內(nèi)部類對(duì)象;
class Demo1_InnerClass {
public static void main(String[] args) {
//外部類名.內(nèi)部類名 對(duì)象名 = 外部類名.內(nèi)部類對(duì)象;
Outer.Inner oi = new Outer.Inner();
oi.method();
Outer.Inner2.print();
}
}
class Outer {
static class Inner {
public void method() {
System.out.println("method");
}
}
static class Inner2 {
public static void print() {
System.out.println("print");
}
}
}
使用已知的變量,在控制臺(tái)輸出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(?); // num
System.out.println(??); // this.num
System.out.println(???); // Outer.this.num
//內(nèi)部類之所以能獲取到外部類的成員,是因?yàn)樗塬@取到外部類的引用外部類名.this
}
}
}
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
局部內(nèi)部類訪問局部變量的問題
- 局部內(nèi)部類訪問局部變量必須用final修飾
- 局部內(nèi)部類在訪問他所在方法中的局部變量必須用final修飾,為什么?
因?yàn)楫?dāng)調(diào)用這個(gè)方法時(shí),局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當(dāng)方法彈棧,這個(gè)局部變量也會(huì)消失,那么如果局部內(nèi)部類對(duì)象還沒有馬上消失想用這個(gè)局部變量,就沒有了,如果用final修飾會(huì)在類加載的時(shí)候進(jìn)入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用
但是jdk1.8取消了這個(gè)事情,所以我認(rèn)為這是個(gè)bug
匿名內(nèi)部類的格式
- A:匿名內(nèi)部類
- 就是內(nèi)部類的簡化寫法。
- B:前提:存在一個(gè)類或者接口
- 這里的類可以是具體類也可以是抽象類。
- C:格式:
new 類名或者接口名(){
重寫方法;
}
- D:本質(zhì)是什么呢?
- 是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象。
匿名內(nèi)部類重寫多個(gè)方法調(diào)用
class Demo2_NoNameInnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
interface Inter {
public void show1();
public void show2();
}
//匿名內(nèi)部類只針對(duì)重寫一個(gè)方法時(shí)候使用
class Outer {
public void method() {
/*new Inter(){
public void show1() {
System.out.println("show1");
}
public void show2() {
System.out.println("show2");
}
}.show1();
new Inter(){
public void show1() {
System.out.println("show1");
}
public void show2() {
System.out.println("show2");
}
}.show2();*/
Inter i = new Inter(){
public void show1() {
System.out.println("show1");
}
public void show2() {
System.out.println("show2");
}
/*public void show3() {
System.out.println("show3");
}*/
};
i.show1();
i.show2();
//i.show3(); //匿名內(nèi)部類是不能向下轉(zhuǎn)型的,因?yàn)? 沒有子類類名
}
}
匿名內(nèi)部類在開發(fā)中的應(yīng)用
//這里寫抽象類,接口都行
abstract class Person {
public abstract void show();
}
class PersonDemo {
public void method(Person p) {
p.show();
}
}
class PersonTest {
public static void main(String[] args) {
//如何調(diào)用PersonDemo中的method方法呢?
PersonDemo pd = new PersonDemo ();
}
}
修改后: ------------------------------------------
class Test1_NoNameInnerClass {
public static void main(String[] args) {
//如何調(diào)用PersonDemo中的method方法呢?
PersonDemo pd = new PersonDemo ();
//pd.method(new Student());
pd.method(new Person() {
public void show() {
System.out.println("show");
}
});
}
}
//這里寫抽象類,接口都行
abstract class Person {
public abstract void show();
}
class PersonDemo {
//public void method(Person p) { //Person p = new Student();
/*
Person p = new Person(){ //父類引用指向子類對(duì)象
public void show() {
System.out.println("show");
}
};
*/
public void method(Person p) {
p.show();
}
}
class Student extends Person {
public void show() {
System.out.println("show");
}
}
匿名內(nèi)部類的面試題
按照要求,補(bǔ)齊代碼
interface Inter { void show(); }
class Outer { //補(bǔ)齊代碼 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制臺(tái)輸出”HelloWorld”
操作結(jié)果為--------------------------------------------------------------
class Test2_NoNameInnerClass {
public static void main(String[] args) {
//Outer.method().show(); //鏈?zhǔn)骄幊?每次調(diào)用方法后還能繼續(xù)調(diào)用方法,證明調(diào)用方法返回的是對(duì)象
Inter i = Outer.method();
i.show();
}
}
//按照要求,補(bǔ)齊代碼
interface Inter {
void show();
}
class Outer {
//補(bǔ)齊代碼
public static Inter method() {
return new Inter() {
public void show() {
System.out.println("show");
}
};
}
}