Java基礎
Java概述
何為編程
編程就是讓計算機為解決某個問題而使用某種程序設計語言編寫程序代碼,并 終得到結果的過程。 為了使計算機能夠理解人的意圖,人類就必須要將需解決的問題的思路、方法、 和手段通過計算機能夠 理解的形式告訴計算機,使得計算機能夠根據(jù)人的指令一 步一步去工作,完成某種特定的任務。這種人 和計算機之間交流的過程就是編程
什么是Java?
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優(yōu)點,還摒棄了 C++里難以理解的多繼承、 指針等概念,因此Java語言具有功能強大和簡單易 用兩個特征。Java語言作為靜態(tài)面向對象編程語言的 代表,極好地實現(xiàn)了面向對 象理論,允許程序員以優(yōu)雅的思維方式進行復雜的編程 。
jdk1.5之后的三大版本?
Java SE(J2SE,Java 2 Platform Standard Edition,標準版) Java SE 以前稱為 J2SE。它允許開發(fā) 和部署在桌面、服務器、嵌入式環(huán)境和實時環(huán)境中使 用的 Java 應用程序。Java SE 包含了支持 Java Web 服務開發(fā)的類,并為Java EE和Java ME提供基礎。
Java EE(J2EE,Java 2 Platform Enterprise Edition,企業(yè)版) Java EE 以前稱為 J2EE。企業(yè)版本 幫助開發(fā)和部署可移植、健壯、可伸縮且安全的服務器 端Java 應用程序。Java EE 是在 Java SE 的 基礎上構建的,它提供 Web 服務、組件模型、 管理和通信 API,可以用來實現(xiàn)企業(yè)級的面向服務 體系結構(service-oriented architecture,SOA)和 Web2.0應用程序。2018年2月,Eclipse 宣 布正式將 JavaEE 更名 為 JakartaEE
Java ME(J2ME,Java 2 Platform Micro Edition,微型版) Java ME 以前稱為 J2ME。Java ME 為 在移動設備和嵌入式設備(比如手機、PDA、電視 機頂盒和打印機)上運行的應用程序提供一個健 壯且靈活的環(huán)境。Java ME 包括靈活的用 戶界面、健壯的安全模型、許多內置的網(wǎng)絡協(xié)議以及對可 以動態(tài)下載的連網(wǎng)和離線應用程序 的豐富支持?;?Java ME 規(guī)范的應用程序只需編寫一次,就 可以用于許多設備,而且可 以利用每個設備的本機功能。
JVM、JRE和JDK的關系?
JVM?
Java Virtual Machine是Java虛擬機,Java程序需要運行在虛擬機上,不同的平 臺有自己的虛擬機,因此 Java語言可以實現(xiàn)跨平臺。
JRE
Java Runtime Environment包括Java虛擬機和Java程序所需的核心類庫等。核 心類庫主要是java.lang 包:包含了運行Java程序必不可少的系統(tǒng)類,如基本數(shù) 據(jù)類型、基本數(shù)學函數(shù)、字符串處理、線程、異 常處理類等,系統(tǒng)缺省加載這個包 如果想要運行一個開發(fā)好的Java程序,計算機中只需要安裝JRE即可。
JDK?
Java Development Kit是提供給Java開發(fā)人員使用的,其中包含了Java的開發(fā) 工具,也包括了JRE。所以 安裝了JDK,就無需再單獨安裝JRE了。其中的開發(fā)工 具:編譯工具(javac.exe),打包工具(jar.exe)等

什么是跨平臺性?原理是什么?
所謂跨平臺性,是指java語言編寫的程序,一次編譯后,可以在多個系統(tǒng)平臺上 運行。 實現(xiàn)原理:Java程序是通過java虛擬機在系統(tǒng)平臺上運行的,只要該系統(tǒng)可以安 裝相應的java虛擬機, 該系統(tǒng)就可以運行java程序。
Java語言有哪些特點
簡單易學(Java語言的語法與C語言和C++語言很接近)?
面向對象(封裝,繼承,多態(tài))
平臺無關性(Java虛擬機實現(xiàn)平臺無關性)
支持網(wǎng)絡編程并且很方便(Java語言誕生本身就是為簡化網(wǎng)絡編程設計的)
支持多線程(多線程機制使應用程序在同一時間并行執(zhí)行多項任)?
健壯性(Java語言的強類型機制、異常處理、垃圾的自動收集等)
安全性
什么是字節(jié)碼?采用字節(jié)碼的大好處是什么?
字節(jié)碼:Java源代碼經(jīng)過虛擬機編譯器編譯后產(chǎn)生的文件(即擴展為.class的文 件),它不面向任何特 定的處理器,只面向虛擬機。
采用字節(jié)碼的好處:
Java語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的 問題,同時又保留了解 釋型語言可移植的特點。所以Java程序運行時比較高效, 而且,由于字節(jié)碼并不專對一種特定的機器, 因此,Java程序無須重新編譯便可 在多種不同的計算機上運行。
先看下java中的編譯器和解釋器:
Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬機 器。這臺虛擬的機器在 任何平臺上都提供給編譯程序一個的共同的接口。編譯程 序只需要面向虛擬機,生成虛擬機能夠理解的 代碼,然后由解釋器來將虛擬機代 碼轉換為特定系統(tǒng)的機器碼執(zhí)行。在Java中,這種供虛擬機理解的代 碼叫做字節(jié) 碼(即擴展為.class的文件),它不面向任何特定的處理器,只面向虛擬機。每 一種平臺的解釋器是不同的,但是實現(xiàn)的虛擬機是相同的。Java源程序經(jīng)過編譯 器編譯后變成字節(jié)碼,字節(jié)碼由虛 擬機解釋執(zhí)行,虛擬機將每一條要執(zhí)行的字節(jié) 碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼, 然后在特定的機器上運 行,這就是上面提到的Java的特點的編譯與解釋并存的解釋。

什么是Java程序的主類?應用程序和小程序的主類有何不同?
一個程序中可以有多個類,但只能有一個類是主類。在Java應用程序中,這個主 類是指包含main()方法 的類。而在Java小程序中,這個主類是一個繼承自系統(tǒng) 類JApplet或Applet的子類。應用程序的主類不一 定要求是public類,但小程序 的主類要求必須是public類。主類是Java程序執(zhí)行的入口點。
Java應用程序與小程序之間有那些差別?
簡單說應用程序是從主線程啟動(也就是main()方法)。applet小程序沒有main 方法,主要是嵌在瀏覽器 頁面上運行(調用init()線程或者run()來啟動),嵌入瀏 覽器這點跟flash的小游戲類似。
Java和C++的區(qū)別?
我知道很多人沒學過C++,但是面試官就是沒事喜歡拿咱們Java和C++比呀! 沒辦法?。?!就算沒學過 C++,也要記下來!
都是面向對象的語言,都支持封裝、繼承和多態(tài)
Java不提供指針來直接訪問內存,程序內存更加安全?
Java的類是單繼承的,C++支持多重繼承;雖然Java的類不可以多繼承,但是 接口可以多繼承。
Java有自動內存管理機制,不需要程序員手動釋放無用內存
Oracle JDK 和 OpenJDK 的對比
1. Oracle JDK版本將每三年發(fā)布一次,而OpenJDK版本每三個月發(fā)布一 次;
2. OpenJDK 是一個參考模型并且是完全開源的,而Oracle JDK是 OpenJDK的一個實現(xiàn),并不是完全 開源的;?
3. Oracle JDK 比 OpenJDK 更穩(wěn)定。OpenJDK和Oracle JDK的代碼幾乎 相同,但Oracle JDK有更多的 類和一些錯誤修復。因此,如果您想開發(fā)企 業(yè)/商業(yè)軟件,我建議您選擇Oracle JDK,因為它經(jīng)過 了徹底的測試和穩(wěn) 定。某些情況下,有些人提到在使用OpenJDK 可能會遇到了許多應用程 序崩潰 的問題,但是,只需切換到Oracle JDK就可以解決問題;
4. 在響應性和JVM性能方面,Oracle JDK與OpenJDK相比提供了更好的 性能;
5. Oracle JDK不會為即將發(fā)布的版本提供長期支持,用戶每次都必須通過 更新到最新版本獲得支持來 獲取最新版本;?
6. Oracle JDK根據(jù)二進制代碼許可協(xié)議獲得許可,而OpenJDK根據(jù)GPL v2許可獲得許可。

基礎語法
數(shù)據(jù)類型
Java有哪些數(shù)據(jù)類型?
定義:Java語言是強類型語言,對于每一種數(shù)據(jù)都定義了明確的具體的數(shù)據(jù)類 型,在內存中分配了不同 大小的內存空間。?
分類:
基本數(shù)據(jù)類型?
數(shù)值型?
? ? ?整數(shù)類型(byte,short,int,long) ?
? ? ?浮點類型(float,double)
字符型(char)?
布爾型(boolean)?
引用數(shù)據(jù)類型?
? ?類(class)
? ?接口(interface)?
? ? 數(shù)組([])?
Java基本數(shù)據(jù)類型圖

switch 是否能作用在 byte 上,是否能作用在 long 上,是否 能作用在 String 上
在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。從 Java5 開始,Java 中引入 了枚舉類型,expr 也可以是 enum 類型,從 Java 7 開始,expr 還可以是字符(String),但是長整 型(long)在目前所有的版 本中都是不可以的?
用最有效率的方法計算 2 乘以 8
2 << 3(左移 3 位相當于乘以 2 的 3 次方,右移 3 位相當于除以 2 的 3 次 方)。
Math.round(11.5) 等于多少?
Math.round(-11.5) 等于多少 Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍 五入的原理是在參數(shù)上加 0.5 然后進行下取整
loat f=3.4;是否正確
不正確。3.4 是雙精度數(shù),將雙精度型(double)賦值給浮點型(float)屬于 下轉型(down-casting, 也稱為窄化)會造成精度損失,因此需要強制類型轉 換float f =(float)3.4; 或者寫成 float f =3.4F;。
short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎
對于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 類型,因此 s1+1 運算結果也是 int型,需要強制轉換類型才 能賦值給 short 型。 而 short s1 = 1; s1 += 1;可以正確編譯,因為 s1+= 1;相當于 s1 = (short(s1 + 1);其 中有隱含的強制類型轉換。
編碼
Java語言采用何種編碼方案?有何特點??
Java語言采用Unicode編碼標準,Unicode(標準碼),它為每個字符制訂了一 個唯一的數(shù)值,因此在 任何的語言,平臺,程序都可以放心的使用。
注釋?
什么Java注釋
定義:用于解釋說明程序的文字
分類
單行注釋 格式: // 注釋文字
多行注釋 格式: /* 注釋文字 */?
文檔注釋 格式:/** 注釋文字 */
作用?
在程序中,尤其是復雜的程序中,適當?shù)丶尤胱⑨尶梢栽黾映绦虻目勺x性,有利 于程序的修改、調試和 交流。注釋的內容在程序編譯的時候會被忽視,不會產(chǎn)生 目標代碼,注釋的部分不會對程序的執(zhí)行結果 產(chǎn)生任何影響。 注意事項:多行和文檔注釋都不能嵌套使用。 訪問修飾符
訪問修飾符 public,private,protected,以及不寫(默認)時的 區(qū)別
定義:Java中,可以使用訪問修飾符來保護對類、變量、方法和構造方法的訪 問。Java 支持 4 種不同的 訪問權限。
分類:
private : 在同一類內可見。使用對象:變量、方法。 注意:不能修飾類(外部 類)?
default (即缺省,什么也不寫,不使用任何關鍵字): 在同一包內可見,不使用 任何修飾符。使用 對象:類、接口、變量、方法。
protected : 對同一包內的類和所有子類可見。使用對象:變量、方法。 注意: 不能修飾類(外部 類)。?
public : 對所有類可見。使用對象:類、接口、變量、方法
訪問修飾符圖

運算符
Java 有沒有 goto
goto 是 Java 中的保留字,在目前版本的 Java 中沒有使用。
final 有什么用??
用于修飾類、屬性和方法;
被final修飾的類不可以被繼承?
被final修飾的方法不可以被重寫?
被final修飾的變量不可以被改變,
被final修飾不可變的是變量的引用,而不是引用指向的內容,引用指向的內容是可以改變的
final finally finalize區(qū)別?
final可以修飾類、變量、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修 飾變量表示該變量是一個常量不能被重新賦值。
finally一般作用在try-catch代碼塊中,在處理異常的時候,通常我們將一定要執(zhí)行的代碼方法 finally代碼塊中,表示不管是否出現(xiàn)異常,該代碼塊都會執(zhí)行,一般用來存放一些關閉資源的代 碼。?
finalize是一個方法,屬于Object類的一個方法,而Object類是所有類的父類,該方法一般由垃圾 回收器來調用,當我們調用System.gc() 方法的時候,由垃圾回收器調用finalize(),回收垃圾,一 個對象是否可回收的最后判斷。
this關鍵字的用法?
this是自身的一個對象,代表對象本身,可以理解為:指向對象本身的一個指 針。
this的用法在java中大體可以分為3種:
1.普通的直接引用,this相當于是指向當前對象本身。
2.形參與成員名字重名,用this來區(qū)分:

3.引用本類的構造函數(shù)


super關鍵字的用法
super可以理解為是指向自己超(父)類對象的一個指針,而這個超類指的是離
自己最近的一個父類。
super也有三種用法:
1.普通的直接引用
與this類似,super相當于是指向當前對象的父類的引用,這樣就可以用 super.xxx來引用父類的成員。
2.子類中的成員變量或方法與父類中的成員變量或方法同名時,用super進行區(qū) 分

3.引用父類構造函數(shù)
super(參數(shù)):調用父類中的某一個構造函數(shù)(應該為構造函數(shù)中的第一條語句)。?
this(參數(shù)):調用本類中另一種形式的構造函數(shù)(應該為構造函數(shù)中的第一條語句)。
this與super的區(qū)別
super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數(shù)據(jù)或函 數(shù),基類與派生類中有相同成員定義時如:super.變量名 super.成員函數(shù)據(jù)名(實參)
this:它代表當前對象名(在程序中易產(chǎn)生二義性之處,應使用this來指明當前對象;如果函數(shù)的 形參與類中的成員數(shù)據(jù)同名,這時需用this來指明成員變量名) super()和this()類似,區(qū)別是,
super()在子類中調用父類的構造方法,
this()在本類內調用本類的其 它構造方法。
super()和this()均需放在構造方法內第一行。?
盡管可以用this調用一個構造器,但卻不能調用兩個。
this和super不能同時出現(xiàn)在一個構造函數(shù)里面,因為this必然會調用其它的構造函數(shù),其它的構造 函數(shù)必然也會有super語句的存在,所以在同一個構造函數(shù)里面有相同的語句,就失去了語句的意 義,編譯器也不會通過。
this()和super()都指的是對象,所以,均不可以在static環(huán)境中使用。包括: static變量,static方法,static語句塊。
從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字
static存在的主要意義?
static的主要意義是在于創(chuàng)建獨立于具體對象的域變量或者方法。以致于即使沒有創(chuàng)建對象,也能使用屬 性和調用方法!?
static關鍵字還有一個比較關鍵的作用就是 用來形成靜態(tài)代碼塊以優(yōu)化程序性能。static塊可以置于類中 的任何地方,類中可以有多個static塊。
在類初次被加載的時候,會按照static塊的順序來執(zhí)行每個static 塊,并且只會執(zhí)行一次。為什么說static塊可以用來優(yōu)化程序性能,是因為它的特性:只會在類加載的時候?
執(zhí)行一次。因此,很多時候會將一些只需要進行一次的初始化操作都放在static代碼塊中進行。?
static的獨特之處
1、被static修飾的變量或者方法是獨立于該類的任何對象,也就是說,這些變量和方法不屬于任何一個 實例對象,而是被類的實例對象所共享。

2、在該類被第一次加載的時候,就會去加載被static修飾的部分,而且只在類第一次使用時加載并進行 初始化,注意這是第一次用就要初始化,后面根據(jù)需要是可以再次賦值的。
3、static變量值在類加載的時候分配空間,以后創(chuàng)建類對象的時候不會重新分配。賦值的話,是可以任 意賦值的!
4、被static修飾的變量或者方法是優(yōu)先于對象存在的,也就是說當一個類加載完畢之后,即便沒有創(chuàng)建 對象,也可以去訪問
static應用場景
因為static是被類的實例對象所共享,因此如果某個成員變量是被所有對象所共享的,那么這個成員變量 就應該定義為靜態(tài)變量。
因此比較常見的static應用場景有

static注意事項?
1、靜態(tài)只能訪問靜態(tài)。
2、非靜態(tài)既可以訪問非靜態(tài)的,也可以訪問靜態(tài)的。
流程控制語句
break ,continue ,return 的區(qū)別及作用
break 跳出總上一層循環(huán),不再執(zhí)行循環(huán)(結束當前的循環(huán)體)continue 跳出本次循環(huán),繼續(xù)執(zhí)行下次循 環(huán)(結束正在執(zhí)行的循環(huán) 進入下一個循環(huán)條件)?
return 程序返回,不再執(zhí)行下面的代碼(結束當前的方法 直接返回)
在 Java 中,如何跳出當前的多重嵌套循環(huán)?
在Java中,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個標號,然后在里層循環(huán)體的代碼中使 用帶有標號的break 語句,即可跳出外層循環(huán)。例如
