格式如下 : class A { class B { } } 在 类 A 中调用 B , 可以直接使用 B() 进行调用 ; 在 外部调用 类 B 时 , 可以使用 A.B() 的形式进行调用 ; 在 Java...中内部类有 成员内部类 , 静态嵌套类 , 方法内部类 , 匿名内部类 几种类型 ; Kotlin 嵌套类 , 相当于 Java 中的 静态嵌套类 ; 代码示例 : 在下面的代码中 , 在 Person...双击 Shift , 选择 Show Kotlin Bytecode 选项 , 在 Kotlin Bytecode 界面 中 , 选择 Decompile 选项 , 将 字节码数据 反编译为 Java...Student 数据类 自动生成了一个 toString 方法 , 将其数据打印出来 ; 同时还 重写 Student 数据类 中的 equals 和 hashCode 函数 ; // Student.java...代码数据 , 反编译后的 Java 代码数据如下 : // Student.java import kotlin.Metadata; import kotlin.jvm.internal.Intrinsics
init 初始化块开始执行 次构造函数开始执行 Tom , 18 从上述执行结果上看 , 可以知道先执行 init 初始化块 , 然后执行 次构造函数 ; 查看 Kotlin 字节码 , 并将其反编译回 Java...代码 , 结果如下 : // HelloKt.java import kotlin.Metadata; @Metadata( mv = {1, 4, 2}, bv = {1, 0, 3}...// $FF: synthetic method public static void main(String[] var0) { main(); } } // Hello.java...u0010\u0002\u001a\u00020\u0003¢\u0006\u0002\u0010\u0007R\u001a\u0010\b\u001a\u00020\u0003X\u0086\u000e...¢\u0006\u000e\n\u0000\u001a\u0004\b\t\u0010\n\"\u0004\b\u000b\u0010\u0004R\u001a\u0010\f\u001a\u00020
先让我们看下实现同样的功能,Java和Kotiln的对比: // JAVA,20多行代码,充斥着findViewById,类型转换,匿名内部类这样的无意义代码 public class MainJavaActivity...\n\u0002\u0010\u0008\n\u0002\u0008\u0003\u001a \u0010\u0000\u001a\u00020\u0001*\u0008\u0012\u0004\u0012...\u00020\u00030\u00022\u0006\u0010\u0004\u001a\u00020\u00032\u0006\u0010\u0005\u001a\u00020\u0003\u00a8...\n\u0002\u0010\b\n\u0002\b\u0003\u001a \u0010\u0000\u001a\u00020\u0001*\b\u0012\u0004\u0012\u00020\u00030...\u00022\u0006\u0010\u0004\u001a\u00020\u00032\u0006\u0010\u0005\u001a\u00020\u0003¨\u0006\u0006"},
Kotlin Bytecode " 选项 , 在 " Kotlin Bytecode " 界面查看 Kotlin 编译后的 字节码数据 , 点击 " Decompile " 按钮 , 将字节码反编译回 Java...代码 ; 完整的 反编译 后的 Java 代码如下 : // HelloKt.java import kotlin.Metadata; @Metadata( mv = {1, 4, 2},...\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004...代码 ; 再次查看反编译后的 java 代码 : // HelloKt.java import kotlin.Metadata; @Metadata( mv = {1, 4, 2},...\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004
文章目录 一、使用 @JvmField 注解暴露 Kotlin 字段给 Java 1、Java 类中通过 Getter 和 Setter 方法访问 Kotlin 字段 2、Java 类中直接访问被...Kotlin 字段给 Java ---- 1、Java 类中通过 Getter 和 Setter 方法访问 Kotlin 字段 在 Java 中是 不能直接访问 Kotlin 中的字段 的 , 必须...\u0010\u0003\u001a\u00020\u00042\b\b\u0002\u0010\u0005\u001a\u00020\u00062\b\b\u0002\u0010\u0007\u001a...\u00020\u00042\b\b\u0002\u0010\u0005\u001a\u00020\u00062\b\b\u0002\u0010\u0007\u001a\u00020\bH\u0007¨...\u00020\nR\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005
普通函数代码示例 三、内联函数代码示例 一、内联函数 ---- 1、Lambda 表达式弊端 Lambda 表达式弊端 : Lambda 表达式 的 灵活使用 , 是以 牺牲内存开销为代价的 ; 在 Java...Kotlin 语言中提供了一种 " 内联 " 机制 , 解决了上面的 Lambda 表达式的 内存开销 问题 , 将 使用 Lambda 表达式 作为参数的函数 定义为 inline 内联函数 , Java...action: (String, Int) -> String) { val act = action(name, age); println(act) } 将字节码转换为 Java...\u0006\u0010\u0000\u001a\u00020\u0001\u001a0\u0010\u0002\u001a\u00020\u00012\u0006\u0010\u0003\u001a\...\u0006\u0010\u0000\u001a\u00020\u0001\u001a3\u0010\u0002\u001a\u00020\u00012\u0006\u0010\u0003\u001a\
机制避免内存开销 3、内联函数本质 - 编译时宏替换 4、内联函数不能递归 十七、普通函数代码示例 十八、内联函数代码示例 十九、函数引用作为函数参数 二十、函数类型作为函数返回值 二十一、闭包概念 二十二、Java...\u0006\u0010\u0000\u001a\u00020\u0001\u001a0\u0010\u0002\u001a\u00020\u00012\u0006\u0010\u0003\u001a\...u00020\u00042\u0006\u0010\u0005\u001a\u00020\u00062\u0018\u0010\u0007\u001a\u0014\u0012\u0004\u0012\u00020...\u0006\u0010\u0000\u001a\u00020\u0001\u001a3\u0010\u0002\u001a\u00020\u00012\u0006\u0010\u0003\u001a\...u00020\u00042\u0006\u0010\u0005\u001a\u00020\u00062\u0018\u0010\u0007\u001a\u0014\u0012\u0004\u0012\u00020
文章目录 一、Kotlin 变量可空性 1、Java 与 Kotlin 空值处理区别 2、Java 函数返回非空值和控制 3、Kotlin 函数调用 Java 函数 4、平台类型 5、@NotNull...mv = {1, 4, 2}, bv = {1, 0, 3}, k = 2, d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a...\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"}, d2 = {"sayHello", "", "KotlinDemo"} ) public...mv = {1, 4, 2}, bv = {1, 0, 3}, k = 2, d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a...\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"}, d2 = {"sayHello", "", "KotlinDemo"} ) @JvmName
怎么研究 Kotlin和Java都是运行在JVM上,但是实际上JVM并不认识Java和Kotlin,因为它只和bytecode(即class文件)打交道。...u0002\u0018\u00002\u00020\u0001B\u0007\u0008\u0002\u00a2\u0006\u0002\u0010\u0002J\u0006\u0010\u0003\u001a...u0010\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0006\u0010\u0003\u001a...u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0008\u0002\n\u0002\u0010\u0000\n\u0000\u0010\u0000\u001a...\u00020\u00012\u000e\u0010\u0002\u001a\n \u0004*\u0004\u0018\u00010\u00030\u00032\u000e\u0010\u0005\u001a
名列后几位的分别是 Java、C 语言、C++和 R 语言。...也就是说会直接获取到\u001A也就是EOF: ? 当fastjson再次向后进行解析时,会不断重复获取EOF,并将其写到内存中,直到触发oom错误: ? 最终效果为: ?
最后,文章提到Java中的受查异常机制存在争议,而Kotlin作为一种新的JVM语言,避免了这一问题。 你知道吗,Java中的受查和非受查异常,其实并不存在区别.........相信写过 Java 的人都会知道,在 Java 的异常系统中,存在“受查(checked)”异常和“非受查(unchecked)”两座大山,两者虽然均为异常,但是却有着微妙的区别。...Java 的语言设计者赋予 Java 编译器巨大的魔力,在不变动中间表示代码(这里是 JVM 字节码)的情况下提供更多的语法特性或者语义限制。...48 #29 = Utf8 d1 #30 = Utf8 \u0000\u0006\n\u0000\n\u0002\u0010\u0002\u001a...\u0006\u0010\u0000\u001a\u00020\u0001 #31 = Utf8 d2 #32 = Utf8 #33 = Utf8
Metadata(d1 = {"\u0000\u0010\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\u001a...\u001b\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00010\u0003H\u0007¢
; import java.util.HashMap; import java.util.List; import java.util.Map; /** * fastjson 坑啊!...: java.util.HashMap cannot be cast to com.alibaba.fastjson.JSONObject at T.main(T.java:31) 很明显,第 31...(JSON.java:128) at T.main(T.java:11) 好奇不?...由于 index>= this.len 始终成立,则意味着会直接获取到 \u001A,相当于 26,带来的结果就是 isEOF 永远为 false,意味着要无休止的读下去。 ?...(JSON.java:193) at com.alibaba.fastjson.JSON.parse(JSON.java:149) at T.main(T.java:11) 走心: 金无足赤人无完人
也就是说会直接获取到\u001A也就是EOF: ? 当fastjson再次向后进行解析时,会不断重复获取EOF,并将其写到内存中,直到触发oom错误: ? 最终效果为: ?
随着互联网的发展,Java语言在金融服务业、电子商务、大数据技术等方面的应用极其广泛。Java安全编码规范早已成为SDL中不可或缺的一部分。...本文以Java项目广泛采用的两个框架Hibernate和MyBatis 为例来介绍,如何在编码过程中避免SQL注入的几种编码方法,包括对预编译的深度解析,以及对预编译理解的几个“误区”进行了解释。...备注,本文是Java语言安全编码会是系列文章的第一篇。 0x01框架介绍 目前Hibernate和MyBatis为java项目广泛采用的两个框架。...buf.append('r'); break; case '\u001a...mysql-connector-java里面有个非常巧妙的点是,他会根据你传入的类型判断。比如传入的为int类型。就会走setInt。传入的为string就会走setString。
原文Generics in Java....:实现Java在编译时期进行类型检查。...由于Java不支持多重继承,所以只能扩展一个类。...in Java, and we use them to refer to an unknown type....因此,这将是您练习Java泛型的理想文章。❤️I will bring you another Java stuff next time.下次我会给您带来另一款Java产品。Bye guys! 再见
,Sun官方所定义的Java技术体系包括: Java程序设计语言 JavaAPI类库 运行于各个硬件平台上的虚拟机 Class文件格式 商业机构和开源社区的第三方Java类库 JDK: 包括Java...程序设计语言、JavaAPI类库、运行于各个硬件平台上的虚拟机,JDK是用于支持Java程序开发的最小环境; JRE: Java API类库中的Java SE API子集和Java虚拟机这两部分统称为...JRE与JDK的区别: JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。...JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。...Java SE: 支持面向桌面级应用的JAVA平台,提供了完整的Java核心API,这个版本以前称为J2SE。
一、Java 简介 1.1 Java 发展史 —————— 选自 《 疯狂 Java 讲义(第四版)》 Java 语言的诞生具有一定的戏剧性,它并不是经过精心策划、制作,最后产生的划时代产品,从某个角度来看...这标志着 Java 已经吹响了向企业、桌面和移动三个领域进军的号角,标志着 Java 已经进入 Java2 时代,这个时期也是 Java 飞速发展的时期。 ...1.3 Java 相关概念 1.3.1 JVM JVM 是 Java Virtual Machine( Java 虚拟机)的缩写,就是我们常说的java虚拟机。...Java 语言使用 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 ...Java 虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java 语言的可移植性正是建立在 Java 虚拟机的基础上。
所有的 Java虚拟机实例必须在每个类或接口被 Java程序“首次主动使用”时才初始化它们。...八、java -> class -> 执行 ---- Java程序运行时,必须经过编译和运行两个步骤。首先将后缀名为.java的源文件进行编译,最终生成后缀名为.class的字节码文件。...Java.lang.ClassNotFoundException Java.lang.NoSuchMetodException Java.io.IOException Exception:一般分为 Checked...【1】Checked 异常:只有 java语言提供了 Checked异常,Java 认为 Checked异常都是可以被处理的异常,所以 Java程序必须显示处理 Checked异常。...【8】Date/Time API (JSR 310):Java 8 新的 Date-Time API (JSR 310)受Joda-Time的影响,提供了新的 java.time包,可以用来替代 java.util.Date