首页 > 其他分享 >android开发kotlin顶级函数和拓展函数的实现原理

android开发kotlin顶级函数和拓展函数的实现原理

时间:2023-02-12 00:44:19浏览次数:44  
标签:函数 MainActivityKt kotlin 拓展 MainActivity static extTest android

android开发kotlin顶级函数和拓展函数的实现原理

//我们编写的源代码在MainActivity.kt下面,如下:
fun topTest(){
    print("123")
}

fun MainActivity.extTest(){
    print("456")
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        suyf()
        extTest()
    }
}

//经过编译器处理后的代码等价如下java代码MainActivity.java,如下:
public final class MainActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(C0749R.layout.activity_main);
        MainActivityKt.topTest();//顶级函数本质就是static函数 ,编译器帮我们自动添加了MainActivityKt.
        MainActivityKt.extTest(this);//拓展函数本质上就是static函数,编译器帮我们自动添加了MainActivityKt.和this参数
    }
}
//另外生成了一个Kt结尾的MainActivityKt.java类,用于存放顶级函数和拓展函数,编译时帮我们在调用处添加了MainActivityKt.前缀。
public final class MainActivityKt {
    public static final void topTest() {
        System.out.print((Object) "123");
    }

    public static final void extTest(MainActivity extTest) {  //编译器帮我们自动添加了一个类型为拓展类的参数
        Intrinsics.checkNotNullParameter(extTest, "$this$extTest");  //这个就是判断?非空语法的实现,无非就是判空检查一下
        System.out.print((Object) "456");
    }
}

//结论:kotlin里的顶级函数本质就是java的static函数;拓展函数本质上也是static函数,另外拓展函数会自动多添加了类型为拓展类的参数,调用时传递了this进来。
//这些细节都是编译器在编译过程帮我们自动处理了,简直就是隐藏了太多细节了。

标签:函数,MainActivityKt,kotlin,拓展,MainActivity,static,extTest,android
From: https://www.cnblogs.com/yongfengnice/p/17113149.html

相关文章

  • 字符串常用函数
    供自己查询使用,随时补充常用函数切片#[start:end:step]左闭右开[start,end)s="Helloword"print(s[1:5])#ello默认step=1print(s[6:])#word[satrt-......
  • C++匿名函数
    #include<iostream>std::stringaaa="111";intmain(){//[]称为lambda捕获列表,它的含义为:告诉编译器需要在匿名函数内部使用外部的变量。捕获列表中的内容......
  • Spring构造函数
    Spring中的一个bean,需要实例化得到一个对象,而实例化就需要用到构造方法。一般情况下,一个类只有一个构造方法:要么是无参的构造方法要么是有参的构造方法如果只有一个......
  • 第 21 章 使用 Java 编写 Android 应用
    21.1Android的历史......................................35721.2编写Android应用.................................35821.2.1组织Android项目..................
  • vue2 data 一定要是函数吗?
    答:不一定,可以是对象,vue文档中表述有误导性而已,他自己的例子里也有对象的形式functioninitData(vm){letdata=vm.$options.datadata=vm._data=typeofdata......
  • Android学习1
    1、Log日志    如果Logcat里的日志类型选的是Debug(Log.d),那么它和它前面的(Log.i,Log.w,Log.e)日志信息都会被显示,其他类型以此类推 2、......
  • Android-Service详解
    前言Service是长期运行在后台的应用程序组件。Service 是和应用程序在同一个进程中,所以应用程序关掉了,Service也会关掉。可以理解为Service是不能直接处理耗时操作的......
  • 原型 / 构造函数 / 实例
    原型(prototype):一个简单的对象,用于实现对象的属性继承。可以简单的理解成对象的爹。在Firefox和Chrome中,每个JavaScript对象中都包含一个_proto_(非标准)的属性指向它爹(该......
  • Java8新特性3-Lambda-内置功能性函数式接口
    比较典型的几个Java8的内置功能性函数式接口在java.util.function包下,主要有四大核心的内置功能型函数式接口:谓词(Predicate)函数(Function)生产者(Supplier)消费者(Cons......
  • android ndk生成第三方库的so方法(ndk-build,Application.mk,Android.mk)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......