当前位置:科普知识站>IT科技>

java|android

IT科技 阅读(9.18K)

<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文件。