大家好,我是
方圓
,您說,咱不得把這基礎知識辦的明明白白的?
文章目錄
Java概述
1. 什麼是Java?
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++裏難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。
2. JVM、JRE和JDK的關係
- JVM是Java虛擬機,Java程序需要跑在JVM上,不同平臺擁有自己的JVM,這也就實現了Java的跨平臺性。
- JRE是Java運行環境,如果僅想運行Java程序,僅安裝JRE即可。
- JDK包含了Java開發工具(java.exe、javac.exe和jar,exe)和JRE。
3. 解釋一下跨平臺性
Java程序經過一次編譯後,即可在多個系統平臺上運行。
實現原理,Java程序運行在JVM上,系統只要安裝了JVM,那麼即可運行Java程序。
4. Java語言的特點
- 面向對象
- 相比於c++簡單
- 跨平臺性
- 支持多線程
- 健壯性(Java語言是強類型的語言、異常處理機制、自動垃圾回收機制)
- 安全性
5. 什麼是字節碼?採用字節碼的好處是什麼?
字節碼是Java源代碼經過JVM編譯後產生的.class文件,面向JVM
好處: 運行起來比較高效,並且實現了跨平臺性
基礎語法
1. Java數據類型
1.1 基本數據類型
- byte 1字節 -27~27-1
- short 2字節 -215~215-1
- int 4字節 -231~231-1
- long 8字節 -263~263-1
- float 4字節 -3.403E38~3.403E38
- double 8字節 -1.798E308~1.798E308
- boolean 1字節
- char 2字節
1.2 引用數據類型
- class
- interface
- 數組
1.3 Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四捨五入的原理是在參數上加 0.5 然後進行下取整。
2. 編碼格式
Java採用的是Unicode編碼標準
3. 修飾符
- public
- protected
- default(默認不寫)
- private
4. final關鍵字
final可以修飾類、方法和變量
- final修飾的類不能被繼承
- final修飾的方法不能被重寫
- final修飾的變量不能被改變,不可變的是引用,而不是指向的內容,內容可以改變
5. final finally 和 finalize的區別
- final修飾的類不能被繼承;修飾的方法不能被重寫;修飾的變量不能被修改
- finally用在try-catch代碼塊兒後,finally中的代碼無論如何都會被執行
- finalize是Object類的方法,該方法由垃圾回收器來調用,當我們調用System,gc()方法的時候,由垃圾回收器調用finalize()方法,是一個對象是否被回收的最後判斷
6. this和super的區別
- super:它引用當前對象的直接父類中的成員(super.變量名 super.成員方法(參數));this:它引用當前類的變量(用於區別二義性的問題)
- super() 在子類中調用父類構造方法;this() 在本類調用其自身的其他構造方法,不能調用兩個
- this() 和super() 指的是對象,不可以在static代碼塊兒中使用
7. static關鍵字
- 修飾類
- 修飾代碼塊兒
- 修飾方法
- 修飾變量
7.1 注意事項
- 靜態只能訪問靜態
- 非靜態既可以訪問靜態又可以訪問非靜態
7.2 靜態變量和實例變量的區別
- 靜態變量又叫類變量,屬於類,在內存中只有一份,在類的加載過程中,JVM只爲靜態變量分配一次內存空間
- 實例變量,它是屬於對象的,根據對象的個數,在內存中存儲的個數也不同,創建幾個對象,就要分配幾次內存空間
7.3 靜態方法和實例方法的區別
- 在外部調用靜態方法的時候,既可以用類名.方法名,也可以用對象名.方法名(一般不這麼用);實例方法只能用後者進行調用
- 靜態方法在訪問本類的成員時,只能訪問靜態變量和靜態方法;實例方法都可以訪問吶
8. 流程控制語句
- break 直接跳出循環體,不再執行循環
- continue 結束本次循環,進行下一次循環
- return 結束當前方法,直接返回值
面向對象
1. 面向對象的利弊
- 優點:易維護,易複用,易擴展,具有封裝、繼承和多態三大特性
- 缺點:性能相比於面向過程低
2. 面向對象的三大特性
2.1 封裝
將一個對象的屬性私有化,並且提供一些可以被外界訪問的方法
2.2 繼承
子類以父類爲基礎,可以增加新得數據或擴展
- 子類繼承的是非private的屬性和方法
- 子類可以擁有自己的屬性和方法,即擴展
- 子類可以對父類的方法進行重寫
2.3 多態
百度百科:在面嚮對象語言中,接口的多種不同的實現方式即爲多態。更好理解就是:你可以把父對象設置成它的子對象,根據實際的對象進行操作,再簡單就是可以將子類賦值給父類。
3. 類與接口
3.1 抽象類和接口的區別
大家可以參考下面這篇文章
接口和抽象類的不同,就像你和我的不同一樣
3.2 抽象類能被final修飾嗎?
當然是大大的不能了!定義出抽象類就是準備要被其他類繼承的,如果被final修飾了這不就自我矛盾了嘛!
4. 構造方法
4.1 在調用子類的構造方法的時候,會先向上調用父類的無參構造,目的是什麼?
幫助子類完成初始化工作。
4.2 構造方法的特性是什麼?
- 名字與類名相同
- 沒有返回值,也不用void修飾
- 生成類的對象時自動執行,不需要調用
5. 內部類
5.1 內部類有哪些?
- 成員內部類
- 靜態內部類
- 局部內部類
- 匿名內部類
5.1.1 成員內部類
public class Outer {
private static int radius = 1;
private int count =2;
class Inner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
System.out.println("visit outer variable:" + count);
}
}
}
成員內部類可以訪問外部類的所有變量和方法,不論靜態與非靜態,公有和私有。成員內部類依賴於外部類的實例,它的創建方式如下
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.visit();
5.1.2 靜態內部類
public class Outer {
private static int radius = 1;
static class StaticInner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
}
}
}
靜態內部類可以訪問外部類所有的靜態變量,而不可以訪問外部類的非靜態變量;靜態內部類的創建方式如下
Outer.StaticInner inner = new Outer.StaticInner();
inner.visit();
5.1.3 局部內部類
public class Outer {
private int out_a = 1;
private static int STATIC_b = 2;
public void testFunctionClass(){
int inner_c =3;
class Inner {
private void fun(){
System.out.println(out_a);
System.out.println(STATIC_b);
System.out.println(inner_c);
}
}
Inner inner = new Inner();
inner.fun();
}
public static void testStaticFunctionClass(){
int d =3;
class Inner {
private void fun(){
//編譯錯誤,定義在靜態方法中的局部類不可以訪問外部類的實例變量
// System.out.println(out_a);
System.out.println(STATIC_b);
System.out.println(d);
}
}
//局部內部類創建對象的方式
Inner inner = new Inner();
inner.fun();
}
}
定義在實例方法中的局部內部類可以訪問外部類的所有變量和方法,定義在靜態方法中的局部內部類只能訪問外部類的靜態變量和方法。
5.1.4 匿名內部類
public class Outer {
private void test(final int i) {
new Service() {
public void method() {
for (int j = 0; j < i; j++) {
System.out.println("匿名內部類" );
}
}
}.method();
}
}
//匿名內部類必須繼承或實現一個已有的接口
interface Service{
void method();
}
匿名內部類的特點
- 匿名內部類必須繼承一個抽象類或者實現一個接口
- 匿名內部類不能定義任何靜態成員和靜態方法
- 當所在的方法的形參需要被匿名內部類使用時,必須聲明爲final
- 匿名內部類不能是抽象的,它必須要實現繼承的類或者實現接口的所有方法
匿名內部類的創建方式
new 類/接口{
//匿名內部類實現部分
}
5.2 內部類的優點
- 內部類對象可以訪問創建它的外部類的所有對象,包括私有
- 內部類不被同一包的其他類所見,具有很好的封裝性
5.3 局部內部類和匿名內部類訪問局部變量的時候,爲什麼要加上final?
public class Outer {
void outMethod(){
final int a =10;
class Inner {
void innerMethod(){
System.out.println(a);
}
}
}
}
因爲生命週期不一致, 局部變量直接存儲在棧中,當方法執行結束後,非final的局部變量就被銷燬。而局部內部類對局部變量的引用依然存在,如果局部內部類要調用局部變量時,就會出錯。加了final,可以確保局部內部類使用的變量與外層的局部變量區分開,解決了這個問題。
6. 重寫和重載
6.1 構造器可以重載嗎?
構造器可以重載,不能被重寫
6.2 重載和重寫的區別
- 重載:在同一個類中,只有方法名相同,參數不同(順序,個數,類型),與方法的返回值和權限修飾符無關
- 重寫:發生在繼承或實現中,方法名、參數列表必須相同,返回值小於等於父類,異常小於等於父類,訪問權限大於等於父類
7. 對象相等的判斷
7.1 == 和equals的區別是什麼?
- == 基本數據類型比較的是值,引用數據類型比較的是地址
- equals 在類重寫equals方法的情況下,比較的是內容;在沒有被重寫的情況下,功能和==一樣。
7.2 hashCode和equals
7.2.1 爲什麼要有hashCode?
我們以向HashSet中插入值,檢查重複爲例子,HashSet會計算對象的哈希值來確定它的位置,同時也會將其哈希值與其他的對象做比較,如果沒有一樣的,那麼HashSet會認爲新加入的對象沒有重複;若發現了它的哈希值和其他對象相同,那麼會調用equals方法再比較它們的內容是否一致,若不同,則添加成功,否則認爲對象重複,添加失敗。這樣可以減少equals的執行次數,加快效率。
7.2.2 hashCode與equals的相關規定
- equals返回true的兩個對象,hashCode一定相等
- hashCode相等的兩個對象,equals不一定相等
所以,equals方法被重寫,hashCode方法也要被重寫。
8. 值傳遞
Java語言總是採用按值調用。也就是說,方法得到的是值的拷貝。
- 方法可以修改引用數據類型的參數狀態
- 方法不可以修改基本數據類型的值,也不可以讓對象引用新的對象
反射
大家有時間可以看一下這篇文章
註解和反射詳解
String
1. String
1.1 什麼是字符串常量池?
字符串常量池位於堆內存中,專門用來存儲字符串常量,可以提高內存的使用率,避免開闢多塊兒內存空間存儲相同的字符串。在創建字符串的時候,JVM會首先檢查字符串常量池,如果該字符串已經在常量池中,則返回它的引用,否則創建一個新的字符串加入到常量池中。
1.2 String不是基本數據類型
String底層是char類型的數組。
1.3 String類型爲什麼是不可以改變的?
我們不妨看一下源碼
/** The value is used for character storage. */
private final char value[];
大大的眼睛有沒有看見final修飾?
而且String類是被final修飾的,不能被繼承
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
1.3.1 String str="i"與 String str=new String(“i”)一樣嗎?
不一樣啊。String str="i"是將字符串分配到常量池中;String str=new String(“i”)是將其分配到了堆中。
1.4 String作爲Map的key有什麼好呢?
因爲String是不可變的類型,所以它的hashCode不會改變,這樣就相比於其他類型的對象更好。
1.5 StringBuffer和StringBuilder的區別是什麼?
- StringBuffer對方法加了synchronized同步鎖,是線程安全的。
- StringBuilder是非線程安全的。
參考文獻
筆者水平有限,還需大家批評指正,共同進步!