開心生活站

位置:首頁 > IT科技 > 

java,android

IT科技8.86K

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java android是什麼,讓我們一起了解一下?

Android開發是以Java語言爲開發工具,java和Android的區別在於Android程序是基於組件和配置的,表面上看他們有點同宗不同門,但實際上區別十分大,Android是一個主流智能手機操作系統,Java是一種開發語言。

Java和Android有什麼聯繫?

Android的應用層上的應用程序是用Java編寫的,以Java作爲開發語言,但是,Java並不等同於Android,因爲Android  SDK引用了Java SDK的大部分,少數部分被Android SDK所拋棄。所以,要想從事Android的開發,就必須有Java基礎。

Android和Java有什麼區別?

Android是主流智能手機的操作系統,Java是一種開發語言,兩者沒有好壞優勢之分,只是兩種職業崗位選擇,學安卓從事移動互聯方向開發,學Java從事軟件方向開發,主要看個人選擇,從學Java轉移到安卓,學安卓轉移到Java都是可以的。

java android

那麼在實際應用中,我們要深入瞭解Android和Java的哪方面?

深入Android對Java8支援的實現。一個新的Java版本發佈可能會帶來諸多方面的變更,比如:新的語法、字節碼變化、工具支援、API、JVM等,通常Android開發者關注的Android的Java8支援方面更多的是語法特性這部分,Java8的其中一個重大變更就是 引入了 lamda表達式,那麼接下來我們來看下Android是如何處理支援Java8新的語法的。

Lambda 表達式

class Java8 {  interface Logger {    void log(String s);  }  public static void main(String... args) {    sayHi(s -> System.out.println(s));  }  private static void sayHi(Logger logger) {    logger.log("Hello!");  }}12345678910111213

例子中我們在main方法內部的sayHi方法調用時傳入了一個lambda表達式。
接下來我們先使用javac將上面的源碼編譯成class檔案,再透過 dx 工具嘗試轉換成dex檔案時,此時dx工具拋出異常了。

$ javac *.java$ lsJava8.java Java8.class Java8$Logger.class$ $ANDROID_HOME/build-tools/28.0.02/dx --dex --output . *.classUncaught translation error: com.android.dx.cf.code.SimException: ERROR in Java8.main:([Ljava/lang/String;)V: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)1 error; aborting123456789

這是因爲lamda表達式在Java字節碼層面使用了invokedynamic指令,而Android對 字節碼指令 invokedynamic 在設備sdk 版本大於26才支援。可以透過 javap -verbose Java8 檢視Java8.class的字節碼。

那麼Android要實現對所有設備api版本的 lambda函數的支援呢?

目前,Android是透過脫糖的方式來實現。

注:dx工具是負責將 輸入的java字節碼檔案合併轉換爲android的dex檔案。

標籤:java android