JAVA基礎(chǔ)整合

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)系
JDK,JRE,JVM的關(guān)系
java程序編譯過程
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)制轉(zhuǎn)十進(jìn)制
任意進(jìn)制轉(zhuǎn)十進(jìn)制
十進(jìn)制到任意進(jìn)制的轉(zhuǎn)換圖解
十進(jìn)制轉(zhuǎn)任意進(jìn)制
十進(jìn)制轉(zhuǎn)任意進(jìn)制
快速的進(jìn)制轉(zhuǎ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類型沒有明確指定他的大小
使用變量的注意事項(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)換
      隱式轉(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)換過程
    強(qiáng)制轉(zhuǎn)換過程
  • C:強(qiáng)制轉(zhuǎn)換的注意事項(xiàng)
  • 如果超出了被賦值的數(shù)據(jù)類型的取值范圍得到的結(jié)果會(huì)與你期望的結(jié)果不同


    強(qiáng)制轉(zhuǎn)換的注意事項(xiàng)
    強(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)算符的基本用法
    邏輯運(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ū)別
    &&和&的區(qū)別
位運(yùn)算符的基本用法
  • A:位運(yùn)算符有哪些
  • &,|,^,~ ,>>,>>>,<<
  • B:案例演示
  • 位運(yùn)算符的基本用法1


    位運(yùn)算符的基本用法
    位運(yùn)算符的基本用法
  • &,|,^,~ 的用法
    • &:有0則0
    • |:有1則1
    • ^:相同則0,不同則1
    • ~:按位取反
  • 位運(yùn)算符的基本用法2


    位運(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ù)類型不同。
數(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)制位】
    
數(shù)組的地址含義
數(shù)組的地址含義
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í)候回收。

一個(gè)數(shù)組內(nèi)存圖解
一個(gè)數(shù)組內(nèi)存圖解
兩個(gè)數(shù)組內(nèi)存圖解
兩個(gè)數(shù)組內(nèi)存圖解
三個(gè)引用兩個(gè)數(shù)組內(nèi)存圖解
三個(gè)引用兩個(gè)數(shù)組內(nèi)存圖解
數(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ù)組
靜態(tài)初始化內(nèi)存圖
靜態(tài)初始化內(nèi)存圖
數(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ù)組格式1
二維數(shù)組格式1
二維數(shù)組格式2
二維數(shù)組格式2
二維數(shù)組格式3
二維數(shù)組格式3
二維數(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ù)類型的值傳遞
基本數(shù)據(jù)類型的值傳遞

引用數(shù)據(jù)類型的值傳遞,改變原值,因?yàn)榧词狗椒◤棗?,但是堆?nèi)層數(shù)組對(duì)象還在,可以通過地址繼續(xù)訪問
引用數(shù)據(jù)類型的值傳遞
引用數(shù)據(jù)類型的值傳遞

Java中到底是傳值還是傳址

java中只有傳值, 因?yàn)榈刂分狄彩侵担ㄖС终吒咚玖?---java)

面向?qū)ο筇卣?/h5>
  • 封裝(encapsulation)
  • 繼承(inheritance)
  • 多態(tài)(polymorphism)
面向?qū)ο笈c面向過程的區(qū)別
  • 面向?qū)ο?
    1. 找回?cái)偧屣灥睦洗髬?老大媽包含: 攤煎餅的技術(shù),做煎 餅)
    2. 給錢
  • 面向過程:
    1. 學(xué)習(xí)攤煎餅的技術(shù)
    2. 買材料薄脆,油,面粉....
    3. 開始攤
    4. 收拾
類和對(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ì)象的內(nèi)存圖
二個(gè)對(duì)象
二個(gè)對(duì)象
二個(gè)對(duì)象的內(nèi)存圖
二個(gè)對(duì)象的內(nèi)存圖
三個(gè)引用兩個(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ù)
    形式參數(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)建過程
    對(duì)象的創(chuàng)建過程
static關(guān)鍵字及內(nèi)存圖
不帶static內(nèi)存圖
不帶static內(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
    水果
    蘋果
    香蕉
    橘子

采用假設(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");
         }
       };
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,824評(píng)論 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,202評(píng)論 1 10
  • 1、一個(gè)".java"源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制?答:可以有多個(gè)類,但只能有一個(gè)publ...
    岳小川閱讀 1,028評(píng)論 0 2
  • 這是2016年的上半年第二次來廈門了。但這次來廈門有些意外,就像一個(gè)情竇初開的女孩意外懷了孕,有些慌亂,有些沒準(zhǔn)備...
    信貸評(píng)審人閱讀 525評(píng)論 1 0
  • 我是一只貓,一只藍(lán)眼睛的流浪的貓。 那時(shí)我來到一座小城,在一所中學(xué)附近暫居。圍墻不是很高,我可以很輕松地跳過去。墻...
    柳塵微閱讀 472評(píng)論 3 5

友情鏈接更多精彩內(nèi)容