Kotlin学习历程——嵌套类与内部类

京东APP收银台Kotlin化实践(1) 想对Kotlin有全面、深刻的理解,还得从语言的源头入手,溯洄从之,一路探究。在原生化改造过程中我们面临一个选择:是继续使用Java还是选用Kotlin,收银台团队认为Kotlin是Andrioid开发的未来,谷歌的全力支持和未来丰富的语言生态让我们有理由相信Kotlin在移动端的远大且光明的前景。Kotlin独有的特性有:data类,sealed类,解构,中缀表达,访问范围,操作符重载,主从构造器,内部类/嵌套类,属性访问器(内置setter和getter方法),属性延迟初始化,类型继承体系。 阅读详情

Kotlin语言中文站

嵌套类

与Java类似,在Kotlin中类与类可以互相嵌套,类与接口也可以互相嵌套。

class LoginContract {
    private val TAG = javaClass.simpleName

    class Presenter : BasePresenter<View>() {
        fun login(username: String, pwd: String) {
            //取不到TAG常量
        }
    }
}

如上代码,如果按照Java的思维,Presenter是LoginContract的内部类,可正常访问LoginContract内部成员。但实际Presenter是取不到TAG常量的,我们把代码转成Java代码看看究竟:

public final class LoginContract {
    private final String TAG = this.getClass().getSimpleName();
    
    public static final class Presenter extends BasePresenter {
        public final void login(@NotNull String username, @NotNull String pwd) {
            //静态内部类取不到TAG常量
        }
    } 
}

静态内部类! 所以,在Kotlin中上面的代码叫嵌套类,是不持有外部类对象引用的。

除了类里面嵌套类,类里面也可以嵌套接口或者接口里面嵌套类。

class LoginContract {
    private val TAG = javaClass.simpleName

    interface View {
        fun loginResult(loginResult: Any)
    }
}


//转成Java代码
public final class LoginContract {
   private final String TAG = this.getClass().getSimpleName();

   public interface View {
      void loginResult(@NotNull Object loginResult);
   }
}

内部类

到这里有些同学就有疑问了,之前Java中持有外部类对象引用的内部类到哪里去了? 其实在Kotlin中它有另外的一种写法: 标记为inner的嵌套类能够访问其外部类的成员,会持有外部类对象的引用。

class LoginContract {
    private val TAG = javaClass.simpleName

    //inner的嵌套类持有外部类对象的引用
    inner class Presenter : BasePresenter<View>() {
        fun login(username: String, pwd: String) {
            //可正常访问TAG
            print(TAG)
        }
    }
}

转成Java代码看看:

public final class LoginContract {
   private final String TAG = this.getClass().getSimpleName();

   public final class Presenter extends BasePresenter {
      public final void login(@NotNull String username, @NotNull String pwd) {
         System.out.print(TAG);
      }
   }
}

熟悉的感觉回来了。


匿名内部类

在kotlin中使用对象表达式创建匿名内部类:

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val btn = Button(MeUtils.getInstance().context)
        //匿名内部类
        btn.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
            }
        })
    }
}

上一篇:Kotlin学习历程——泛型
下一篇:Kotlin学习历程——对象声明与伴生对象

京东APP收银台Kotlin化实践 我们把移动端App分为四大类 React/Flutter App Web App(纯网页) Native App(纯原生App) Hybrid app (混合App) o 多View混合型:Native View与WebView交替出现的场景 o 单View混合型:在同一个View内,同时包括Native View和Web View o Web主体型:移动应用的主体是WebView 过去收银台模块采用单View混合型,我们称之为H5收银台。H5收银台开发快,一次开发,iOS和Androi 阅读详情

相关推荐

Kotlin/Java中的反射详解

什么是反射反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。对于Java这种OOP语言来讲,运行状态中,我们可以根据“类的部分信息”来还原“类的全部信息”,这就是Java中的反射。Java虚拟机的体系结构Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上...

u013448469的博客 9178

Kotlin学习:基础语法姿势

1、声明变量 fun main(){ //变量 var a:Int = 1; //常量 val b:Int = 2; } 这里a、b表示变量的名字,冒号后面表示变量的类型。用val表示常量。 fun main(){ //不可为空的类型 var str1:String = "aaa"; //可以为空的类型 var str2:S...

Zystem 634

力扣(Leetcode)第1题:两数之和(C语言版本)

题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6

qq_39855356的博客 3312

Kotlin 一劳永逸实现 TAG

以上方式,都需要在每个类定义相应的 TAG,是比较繁琐的。 那么,在 Kotlin 中可以通过扩展函数统一声明 TAG,避免在每个类中定义相应的 TAG。 我们可以通过如下两种方式实现:

让学习编程变得生动有趣~ 2054

Android System Slice应用加载分析,及启用Slice后,锁屏日期第一次开机正常显示,但后面锁屏不显示问题分析

最近发现Android P上锁屏界面,日期不显示,发现从P开始后,出现了Slice来允许应用以模块化,可交互的方式,插入多个使用场景。Android P的system UI 也使用到了这一特性,表现为锁屏时间,日期,勿扰图标,闹钟等。 如何使用Slice 以System UI中KeyguardSliceView.java来说明它的使用方法 首先,我们打开System UI 的mk 文件,可以看到以...

qq_33595823的博客 3035

手把手教你用Python实现最简单的语义通信(Sem Comm)Demo

本文通过Python和PyTorch,手把手教你构建一个基于深度学习的语义通信(Semantic Communication)Demo。该Demo使用自编码器架构,从MNIST图像中提取低维语义特征进行传输与重建,实现了从“传输比特”到“传递含义”的跨越,并探讨了其效率优势与鲁棒性。

weixin_29080843的博客 247

Kotlin——中级篇(八): 类型别名与属性名冲突解决

严格来说,这个系列教程应该是去年就写完了,但是由于自身的懒惰等原因致使其从去年7月份(2018)停更到现在。至此把这个系列教程捡起来写完它,希望能得到各位看客的原谅与支持。 今天这篇文章详细的讲解kotlin中的类型别名,以及实体类中属性名和关键字冲突的解决方法。 目录 一、类型别名 关键字 : typealias 作用 :为现有类型提供替代名称。 解决代码过于冗余与臃肿的问题 在开发...

weixin_34348111的博客 896

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4574

Android谈起泛型,大家都很佛性,kotlin扩展函数equal

return getClass().getSimpleName(); } } 还有测试类Test2th: public class Test2th extends TestBase { @Override public String toString() { return getClass().getSimpleName(); } } 在使用时,我们可以这样为泛型类Tested指定泛型参数类型。迭代如下: public void startTest() { Tested<Test1th, Test2t

m0_65511857的博客 725

Altium Designer铺铜陷阱:为什么你的死铜总是清除不干净?

本文深入探讨Altium Designer中铺铜操作导致死铜无法清除的常见问题,分析死铜形成的五大诱因,并提供高级参数优化和网络连接性验证技巧。通过调整边界计算精度和泪滴算法设置,有效解决死铜残留问题,提升PCB设计质量与制造良率。

weixin_29169505的博客 359

STM32电机PID速度控制

2.3 STM32电机PID速度控制 之前的文章,完成了直流减速电机的PWM控制、电机测速。本篇文章,将实现电机的速度闭环控制。 在公众号:小白学移动机器人,发送:速度PID,即可获得本篇文章的STM32工程文件以及相关资料。 2.3.1 解决的问题 解决带编码器直流电机的速度闭环问题。 2.3.2 PID理论 将偏差的比例、积分、微分,通过线性组合构成控制量,用控制量对被控对象进行控制,这样的控制器称为PID控制器。在连续空间中,我们通常探讨模拟PID的控制原理,如图所示: 我们这里用电机速度控制为例,

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 6万+

如何在Java代码中更优雅地调用Kotlin

Kotlin与Java良好的互操作性是其能够快速普及的原因之一。从Java虽然可以访问Kotlin,但是通过下面这些技巧可以让对Kotlin的访问变得更加友好和地道 @JvmStatic Kotlin中可以使用object class创建单例 object Analytics { fun init() {...} fun send(event: Event) {...} fun close() {...} } Kotlin侧可以像Java的静态方法一样访问其方法 Analytics.se.

移动端开发干货分享 3995

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3109

Kotlin学习历程七:kotlin中的类之密封类、抽象类和内部类(嵌套类)

一、密封类 sealed 1.1 受限的类继承结构 所谓受限的类继承结构,即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型。 这种受限的类继承结构从某种意义上讲,它相当于是枚举类的扩展。但是,我们知道Kotlin的枚举类中的枚举常量是受限的,因为每一个枚举常量只能存在一个实例。 但是其和枚举类不同的地方在于,密封类的一个子类可以有可包含状态的多个实例。 也可以说成,密封类是包...

LeeKumaの技术Note 493

超声波法检测局部放电的原理与实现

摘要:超声波法通过捕捉局部放电产生的声波信号进行检测,系统由超声波传感器、信号调理单元和数据采集系统组成。其核心应用是局放源定位,主要采用时差定位法和声-电联合定位法。该方法具有抗电磁干扰强、定位精确等优点,但也存在信号衰减大、传播路径复杂等缺点,典型应用于变压器、GIS等设备的在线监测与故障诊断。

start_up_go的博客 374

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Kotlin学习历程五:kotlin中的类的使用

一、类的声明 关键字 声明类的关键字为class 声明格式 class Test{ // 属性... ... // 构造函数 ... // 函数 ... // 内部类 ... ... } 当类没有结构体的时候,大括号可以省略。即: class Test   二、类的构造函数 在Kotlin中,允许有一个主构...

LeeKumaの技术Note 682

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java下跌,Kotlin闯进前15,后生可畏

近年来,Android开发由 Java 转 Kotlin似乎成为了一种潮流。谷歌甚至曾公开表示:“Android 的开发将越来越以 Kotlin 为先。”当前,作为移动开发中Java的劲敌,Kotlin在Tiobe 流行指数中表现强劲。根据TIOBE 11月发布的编程语言排行榜,Kotlin以1.15%的占比位列第15,较之10月上升3位。而在今年9月, Kotlin才以0.9%的占比进入前20名。

datian1234的博客 1077

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

安卓运行内存监控,应聘高级Android工程师历程感言,薪资翻倍

前言 疫情一过,我相信将会是面试求职的高峰时期,如果此时手里有份高质量的面试宝典,那么你将得心应手面对考官各种问题。虽然不敢保证你能应聘上心仪的职位,但是能保证看完这些内容你的收获将超乎你的想象! 此份面试宝典搜集各大网络平台(如果侵权,请您告知),在此感谢他们的用心总结,才有这份足够全面的面试宝典! 内容点较丰富,建议找工作的小伙伴一定要慢慢细细品,我这里随意展示一下,保证不会让你失望! 第一份笔记:Flutter学习笔记 由于篇幅原因,为了避免影响到大家的阅读体验,在此只以截图展示部分内容。 入门——

clhcowboy的博客 282

安卓内存使用情况监控,应聘高级Android工程师历程感言,薪资翻倍

一,鸿蒙核心内容掌握程度 看看下面这些鸿蒙知识点你掌握了多少: 基础环境和开发工具 开发工具安装 运行开发工具完成基础配置DevEco Studio 运行第一个hello world 运行第一个页面 通过代码创建页面 Feature Ability 编程实现页面跳转 市面上的鸿蒙教程大多仅限于理论知识讲解,很少有具体的实现方案案例.在这里小编给大家分享 一份《全面最全最系统的鸿蒙学习笔记》 笔记带你2个礼拜吃透鸿蒙技术开发里的核心原理问题及解决方案,有需要这份鸿蒙学习笔记的

m0_57077995的博客 144

大厂经典高频面试题体系化集合,论程序员成长的正确姿势

前言 笔者是某211非计算机相关专业2018届本科生,在校期间有半年多的互联网小公司实习经历。 毕业之后投递360 ,入职了360企业安全成为专门的前端开发工程师,有幸进入一个很赞的团队,遇到很棒的导师和leader ,成长杠杠的。 跳槽计划 工作一年多后,于今年七月有明确的跳槽计划,这个想法的导火线是4月份薪资不太理想。 此外,北京环境不太好,反正我是不太喜欢,待着也不舒服,当时就开始断断续续的刷技术题,各题型各难度都有认真琢磨。 后面我总结了一下,差不多刷了100多道,每个难度1/3 ,目前的水平是ea

m0_57077948的博客 97

Java快速教程

Java快速教程作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! Java是面向对象语言。这门语言其实相当年轻,于1995年才出现,由Sun公司出品。James Gosling领导了Java的项目小组。该项目的最初只想为家电设计一门容易移植的语言。然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛。Java受到C

MrCharles在优快云 833

Class.getSimpleName()的作用

Class.getSimpleName()的作用  (2012-03-11 16:37:38) 转载▼ 标签:  杂谈 分类: android public class sample{   public static void main(String[] args){     //得到类的简写名称     System.ou

5007

class.getName()和class.getSimpleName()的区别

RT、 如果网上一搜,会有很多答案。 譬如:Class类,是获取类的类模板实例对象,通过反射的机制获取。 根据API中的定义: Class.getName():以String的形式,返回Class对象的“实体”名称; Class.getSimpleName():获取源代码中给出的“底层类”简称。 单看这种书面文字的话,可能有人还是不明白他们的区别,下面我就将通过代码以及图片的形式,

As的博客 5万+
上一篇: Kotlin学习历程——泛型
下一篇: Kotlin学习历程——对象声明与伴生对象
hepingdev
博客等级 码龄5年 3581粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hepingdev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值