java面試題複習(一)

//基礎最重要,若是面試官問一個答不上一個,那有難度的都都不用問了,直接就pass了,就像我,嘿嘿。java

//天天最好熟記10個問題,這些問題在編程是會很厚幫助,幫你避免不少不該該出現的錯誤。面試

1、面向對象的特徵編程

  先說說啥叫面向對象。這個對象可不是你談的那個對象啊。我還記的我剛學Java的時候,老師說:「萬物皆對象,但若是你敢在面試官面前這樣說,就別想被錄取了」。萬物皆對象有點假大空的意思。解釋對象時最好具體爲一類事物。面向對象就是考慮這類對象具備的屬性和功能。比面向過程更容易擴展補充。安全

抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。好比說有一羣小腦斧,咱們把他們的共同特徵總結出來,而不是隻關注其中一隻小腦斧喜歡吃啥,是啥顏色等。jvm

繼承繼承是從已有類獲得繼承信息建立新類的過程。提供繼承信息的類被稱爲父類(超類、基類);獲得繼承信息的類被稱爲子類(派生類)。繼承讓變化中的軟件系統有了必定的延續性,同時繼承也是封裝程序中可變因素的重要手段。注意子類只能繼承父類的公共域和公共方法。通俗點說就是兒子能夠繼承爸爸願意給他的東西,爸爸藏起來的就不能獲得了。想一想看兒子除了繼承爸爸的東西,是否是還能夠有本身的東西,因此通常在java中子類比父類更詳細,具備的內容更多。ide

封裝:通常認爲封裝是把數據和操做數據的方法綁定起來,對數據的訪問只能經過已定義的接口。面向對象的本質就是將現實世界描繪成一系列徹底自治、封閉的對象。好比用手機打電話時只需按幾個鍵,而不須要關心手機是如何將號撥出去的。手機具體的操做細節就能夠當成被封裝起來了。函數

多態多態性是指容許不一樣子類型的對象對同一消息做出不一樣的響應。簡單的說就是用一樣的對象引用調用一樣的方法可是作了不一樣的事情。java的引用變量有兩種類型:編譯時的類型,運行時的類型若是編譯時的類型和運行時的類型不一致,就叫多態。簡單來講就是編譯時調用父類的方法,實際執行的是子類的方法,或者是父類表現出來的行爲特性不像父類,像子類,這種現象叫多態。注意:屬性不具備多態性。最經常使用到多態的是:父類型引用引用子類型對象,這樣一樣的引用調用一樣的方法就會根據子類對象的不一樣而表現出不一樣的行爲。性能

  方法重寫:方法重寫(override)實現的是運行時的多態性(也稱爲後綁定),子類繼承父類並重寫父類中已有的或抽象的方法,。注:和父類有相同的返回值lua

  方法重載:方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),一個類中定義多個同名的方法,但要求每一個方法具備不一樣的參數的類型或參數的個數。注:參數必須不一樣,對返回值類型沒有要求spa

2、public,private,protected,default (不寫時默認就是這個)範圍

從小到大private(類)<default(同一包下)<protected(子類公開)<public(公共)

3、String 是最基本的數據類型嗎,String,StringBuffer,StringBulider的區別?

Java中的基本數據類型只有8個:byte、short、int、long、float、double、char、boolean;(很重要,面試也會問基礎數據類型)

 string是隻讀字符串,肯定後就不變了,不能操做;stringBulider,stringBuffer的字符串能夠直接被修改(增長刪除字符均可以),stringBulider線程不安全,但速度快。通常來講都用StringBuffer。

4、基本數據類型操做

float f=2.8;//坑爹啊,居然不對。記住像2.8之類的是雙精度(double),把它賦值給float向下轉型了,會出現精度損失,必須強制類型轉換。

shout s=2;s=s+1和shout s=2;s+=2;哪一個對?

2是int類型,s+1也是int型,必須強轉類型;s+= 2;至關於s1= (short)(s+ 2);其中有隱含的強制類型轉換

5、Java有沒有goto,const;

固然有了,但目前沒有用到,因此java把他們稱爲保留字。

6、==和equals的區別

==比較的是他們的引用地址是否是同樣,eqluals比較的是值是否相等。偷點懶,就不new對象舉例了,等到看內存堆棧部分再說)

7、基礎類型和包裝類

 原始類型: boolean,char,byte,short,int,long,float,double
包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

包裝類型就是把基礎類型變成了對象。並且java提供自動裝箱拆箱

我偷了個題能夠看看

public class Test {

    public static void main(String[] args) {

        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;

        System.out.println(f1 == f2);

        System.out.println(f3 == f4);   }

}

答案的 true、flase;

由於:當咱們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOf;

public static Integer valueOf(int i) {

    if (i >= IntegerCache.low && i <= IntegerCache.high)

        return IntegerCache.cache[i + (-IntegerCache.low)];

    return new Integer(i);

}

IntegerCache是Integer的內部類,其代碼以下所示

private static class IntegerCache {

        static final int low = -128;

        static final int high;

        static final Integer cache[];

        static {

            // high value may be configured by property

            int h = 127;

            String integerCacheHighPropValue =

                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

            if (integerCacheHighPropValue != null) {

                try {

                    int i = parseInt(integerCacheHighPropValue);

                    i = Math.max(i, 127);

                    // Maximum array size is Integer.MAX_VALUE

                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

                } catch( NumberFormatException nfe) {

                    // If the property cannot be parsed into an int, ignore it.

                }

            }

            high = h;

            cache = new Integer[(high - low) + 1];

            int j = low;

            for(int k = 0; k < cache.length; k++)

                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)

            assert IntegerCache.high >= 127;

        }      private IntegerCache() {}

    }

代碼看不懂不要緊,記住整型字面量的值在-128到127之間,那麼不會new新的Integer對象,而是直接引用常量池中的Integer對象就夠了。

8、邏輯操做符和條件操做符的區別

邏輯操做(&,|,^)、條件操做(&&,||)

邏輯操做符不只能夠操做布爾型還能夠操做數值型;邏輯操做符不會短路

短路:若是&&左邊的表達式的值是false,右邊的表達式會被直接pass掉,就不用管它了

9、內存中的棧(stack)、堆(heap)和靜態區(static area)

堆內存:

一、存儲的所有是對象,每一個對象都包含一個與之對應的class信息(class的目的是獲得操做指令)

二、jvm只有一個堆區(heap)被全部線程共享,堆中不存放基本類型和對象引用,只存放對象自己

注:理論上整個內存沒有被其餘進程使用的空間甚至硬盤上的虛擬內存均可以被當成堆空間來使用

棧內存:

一、每一個線程都有一個棧區,棧中保存對象的引用,還有就是函數調用的現場

二、每一個棧中的數據都是私有的,其餘棧不能訪問(個人錢,別人不能取)

三、棧分爲3個部分:基本變量區、執行環境上下文,操做指令區

四、棧小但操做快

注:」逃逸分析」:從Java 6的某個更新開始能夠將一些局部對象放在棧上以提高對象的操做性能

靜態區

存放字面量和常量

來  看這個  String str = new String("hello");

str放在棧,new出來的字符串放在堆 ,"hello"放在靜態區

而且它建立了兩個對象,一個靜態區的,一個new建立在堆上的對象(可能會被問到)

10、switch 是否能做用在byte 上,是否能做用在long 上,是否能做用在String上?

swith如今除了long型不行,剩下的均可以了。(String--java7;enum--java5)

今天先到這了。/-==/

相關文章
相關標籤/搜索