Android面试题Java基础篇
Android面試題Java基礎篇,由本人整理匯總,后續將繼續推出系列篇,如果喜歡請持續關注和推薦,更多精彩內容可以關注微信公眾號(Android高級編程):android-tech
系列文章目錄:
- Android面試題View篇
- Android面試題進程篇
- Android面試題線程篇
- Android面試題網絡篇
- Android面試題架構篇
- Android面試題系統原理篇
- Android面試題內存&性能篇
一個語言的編譯過程
- 1.詞法分析:將一串文本按規則分割成最小的結構,關鍵字、標識符、運算符、界符和常量等。一般實現方法是自動機和正則表達式
- 2.語法分析:將一系列單詞組合成語法樹。一般實現方法有自頂向下和自底向上
- 3.語義分析:對結構上正確的源程序進行上下文有關性質的審查
- 4.目標代碼生成
- 5.代碼優化:優化生成的目標代碼
Java 中內部類為什么可以訪問外部類
因為內部類創建的時候,需要外部類的對象,在內部類對象創建的時候會把外部類的引用傳遞進去
java類加載過程:
- 1.加載時機:創建實例、訪問靜態變量或方法、反射、加載子類之前
- 2.驗證:驗證文件格式、元數據、字節碼、符號引用的正確性
- 3.加載:根據全類名獲取文件字節流、將字節流轉化為靜態儲存結構放入方法區、生成class對象
- 4.準備:在堆上為靜態變量劃分內存
- 5.解析:將常量池中的符號引用轉換為直接引用
- 6.初始化:初始化靜態變量
靜態方法跟靜態代碼塊有什么區別
靜態方法屬于類,用類名.就能直接調用,靜態代碼塊是類加載的時候就會調用的
關鍵字final和static是怎么使用的
final:
- 1、final變量即為常量,只能賦值一次。
- 2、final方法不能被子類重寫。
- 3、final類不能被繼承。
static:
- 1、static變量 對于靜態變量在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存, 在加載類的過程中完成靜態變量的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。
- 2、static代碼塊
static代碼塊是類加載時,初始化自動執行的。 - 3、static方法
static方法可以直接通過類名調用,任何的實例也都可以調用,因此static方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。
String,StringBuffer,StringBuilder區別
- 1、三者在執行速度上:StringBuilder > StringBuffer > String (由于String是常量,不可改變,拼接時會重新創建新的對象)。
- 2、StringBuffer是線程安全的,StringBuilder是線程不安全的。(由于StringBuffer有緩沖區)
StringBuffer跟StringBuider的區別
StringBuider非線程安全,執行速度快,單線程用這個類
Java中重載和重寫的區別:
- 1、重載:一個類中可以有多個相同方法名的,但是參數類型和個數都不一樣。這是重載。
- 2、重寫:子類繼承父類,則子類可以通過實現父類中的方法,從而新的方法把父類舊的方法覆蓋。
Java中實現多態的機制是什么?
答:方法的重寫Overriding和重載Overloading是Java多態性的不同表現
- 重寫Overriding是父類與子類之間多態性的一種表現
- 重載Overloading是一個類中多態性的一種表現.
說說你對Java反射的理解
JAVA反射機制是在運行狀態中, 對于任意一個類, 都能夠知道這個類的所有屬性和方法; 對于任意一個對象, 都能夠調用它的任意一個方法和屬性。 從對象出發,通過反射(Class類)可以取得取得類的完整信息(類名 Class類型,所在包、具有的所有方法 Method[]類型、某個方法的完整信息(包括修飾符、返回值類型、異常、參數類型)、所有屬性 Field[]、某個屬性的完整信息、構造器 Constructors),調用類的屬性或方法自己的總結: 在運行過程中獲得類、對象、方法的所有信息。
說說你對Java注解的理解
元注解的作用就是負責注解其他注解。java5.0的時候,定義了4個標準的meta-annotation類型,它們用來提供對其他注解的類型作說明。
@Target
@Retention
@Documented
@Inherited
switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。
”==”和equals方法究竟有什么區別?
==和equals都可以比較地址。==是運算符,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字符串內容。
構造方法能否被重寫和重載?
構造方法不能被重寫但是能被重載。
面向對象的特征有哪些?
封裝、繼承、多態和抽象。
抽象類和接口的區別?
- 1).抽象類是abstract class修飾,接口是interface修飾。
- 2).抽象類可以有任意類型的屬性,接口只能有靜態常量修飾的屬性。
- 3).抽象類可以有普通方法和抽象法方法,接口的方法都是抽象方法。
- 4).抽象類和接口都不能實例化,但是抽象類有構造方法,接口沒有構造方法。
- 5).抽象類只能單根繼承,接口可以多重實現。
內部類可以引用它的包含類的成員嗎?有沒有什么限制?
可以引用。如果需要指定當前類時要用外部類.this來引用。如果引用局部變量,需要將局部變量指定為final。
String s = new String(“xyz”);創建了幾個String Object? 二者之間有什么區別?
2個對象。”xyz”創建在字符串常量池中,new String()創建在堆中。
try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
會在return前執行。
Integer與int的區別
Integer為包裝類,int是基本數據類型。包裝類擁有方法和屬性,基本數據類型不具備。包裝類可以通過intValue來轉換成基本數據類型,也可以通過new Integer()將基本數據類型轉換為包裝類。在JDK1.5后,包裝類和基本數據類型可以實現自動轉換。
java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
java中有三種流,分別是字節流(InputStream、OutputStream)、字符流(Reader、Writer)、對象流(ObjectInputStream、 ObjectOutputStream)。
談談final,finally,finalize的區別?
- final是修飾符,可以修飾類(不能被繼承)、屬性(常量)、和方法(不能被重寫)。
- finally是異常處理塊中的代碼塊,表示無論如何都會執行的代碼塊。
- finalize是Object類的方法,該方法在對象被垃圾回收之前執行的方法。
當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
java中只有值傳遞,如果傳遞的對象,實際也是傳遞該對象的地址。
用最有效率的方法算出2乘以8等於幾
將2的二進制向左移3位,java中用<<來移位
是否可以從一個static方法內部發出對非static方法的調用?
不能,除非先創建非static方法所在類的對象。
什么是內部類?內部類的作用
內部類可直接訪問外部類的屬性
Java中內部類主要分為成員內部類、局部內部類(嵌套在方法和作用域內)、匿名內部類(沒構造方法)、靜態內部類(static修飾的類,不能使用任何外圍類的非static成員變量和方法,不依賴外圍類)
使用內部類最吸引人的原因是:每個內部類都能獨立地繼承一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口的)實現,對于內部類都沒有影響。 因為Java不支持多繼承,支持實現多個接口。但有時候會存在一些使用接口很難解決的問題,這個時候我們可以利用內部類提供的、可以繼承多個具體的或者抽象的類的能力來解決這些程序設計問題。可以這樣說,接口只是解決了部分問題,而內部類使得多重繼承的解決方案變得更加完整。
靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
可繼承 不可重寫 而是被隱藏
如果子類里面定義了靜態方法和屬性,那么這時候父類的靜態方法或屬性稱之為"隱藏"。如果你想要調用父類的靜態方法和屬性,直接通過父類名.方法或變量名完成。
java的對象鎖和類鎖的區別
java的對象鎖和類鎖在鎖的概念上基本上和內置鎖是一致的,但是,兩個鎖實際是有很大的區別的,對象鎖是用于對象實例方法,或者一個對象實例上的,類鎖是用于類的靜態方法或者一個類的class對象上的。我們知道,類的對象實例可以有很多個,但是每個類只有一個class對象,所以不同對象實例的對象鎖是互不干擾的,但是每個類只有一個類鎖。但是有一點必須注意的是,其實類鎖只是一個概念上的東西,并不是真實存在的,它只是用來幫助我們理解鎖定實例方法和靜態方法的區別的
總結
以上是生活随笔為你收集整理的Android面试题Java基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下静态库、动态库总结
- 下一篇: android sina oauth2.