Java基礎知識面試題,咱不得在秋招前一起辦辦它?(2020秋招)

大家好,我是方圓,您說,咱不得把這基礎知識辦的明明白白的?

文章目錄

Java概述

1. 什麼是Java?

Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++裏難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。

2. JVM、JRE和JDK的關係

  1. JVM是Java虛擬機,Java程序需要跑在JVM上,不同平臺擁有自己的JVM,這也就實現了Java的跨平臺性。
  2. JRE是Java運行環境,如果僅想運行Java程序,僅安裝JRE即可。
  3. JDK包含了Java開發工具(java.exe、javac.exe和jar,exe)和JRE。

3. 解釋一下跨平臺性

Java程序經過一次編譯後,即可在多個系統平臺上運行。
實現原理,Java程序運行在JVM上,系統只要安裝了JVM,那麼即可運行Java程序。

4. Java語言的特點

  1. 面向對象
  2. 相比於c++簡單
  3. 跨平臺性
  4. 支持多線程
  5. 健壯性(Java語言是強類型的語言、異常處理機制、自動垃圾回收機制)
  6. 安全性

5. 什麼是字節碼?採用字節碼的好處是什麼?

字節碼是Java源代碼經過JVM編譯後產生的.class文件,面向JVM
好處: 運行起來比較高效,並且實現了跨平臺性

基礎語法

1. Java數據類型

1.1 基本數據類型

  1. byte 1字節 -27~27-1
  2. short 2字節 -215~215-1
  3. int 4字節 -231~231-1
  4. long 8字節 -263~263-1
  5. float 4字節 -3.403E38~3.403E38
  6. double 8字節 -1.798E308~1.798E308
  7. boolean 1字節
  8. char 2字節

1.2 引用數據類型

  1. class
  2. interface
  3. 數組

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. 修飾符

  1. public
  2. protected
  3. default(默認不寫)
  4. 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關鍵字

  1. 修飾類
  2. 修飾代碼塊兒
  3. 修飾方法
  4. 修飾變量

7.1 注意事項

  1. 靜態只能訪問靜態
  2. 非靜態既可以訪問靜態又可以訪問非靜態

7.2 靜態變量和實例變量的區別

  • 靜態變量又叫類變量,屬於類,在內存中只有一份,在類的加載過程中,JVM只爲靜態變量分配一次內存空間
  • 實例變量,它是屬於對象的,根據對象的個數,在內存中存儲的個數也不同,創建幾個對象,就要分配幾次內存空間

7.3 靜態方法和實例方法的區別

  1. 在外部調用靜態方法的時候,既可以用類名.方法名,也可以用對象名.方法名(一般不這麼用);實例方法只能用後者進行調用
  2. 靜態方法在訪問本類的成員時,只能訪問靜態變量和靜態方法;實例方法都可以訪問吶

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 內部類有哪些?

  1. 成員內部類
  2. 靜態內部類
  3. 局部內部類
  4. 匿名內部類
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 內部類的優點

  1. 內部類對象可以訪問創建它的外部類的所有對象,包括私有
  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是非線程安全的。

參考文獻

Java基礎知識面試題(2020最新版)


筆者水平有限,還需大家批評指正,共同進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章