kotlin中的嵌套类与内部类
Java中的内部类和静态内部类
在Java中内部类简言之就是在一个类的内部定义的另一个类。当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类。
关于内部类 和静态内部类除了修饰符的区别之外,最主要的是内部类会默认持有一个外部类的引用,也正是这个原因内部类可以直接引用外部类的属性和方法,而不受制于外部类中属性和方法的修饰符。而静态内部类不持有外部类的应用,所以基本跟一个外部类没有什么区别。
下面用代码来说明一下上面的规则。
Java代码
package ja; //外部类
public class OutClass {
private int count = 0; private void add(){
count++;
} //内部类
class InnerClass{
public int getSomething(){
//直接可以调用外部类的方法
add();
return count;
}
} public static class StaticInnerClass{
public int getValue(){
//不持有外部类的引用,所以必须通过外部类的对象来访问
OutClass outClass = new OutClass();
outClass.add();
return outClass.count;
}
}
} package ja; public class Main {
public static void main(String[] args) {
//必须现new出外部类的对象,才能new出内部类的对象
OutClass.InnerClass innerClass = new OutClass().new InnerClass();
int res = innerClass.getSomething();
System.out.println(res); //静态内部类直接可以new出内部类的对象
OutClass.StaticInnerClass staticInnerClass = new OutClass.StaticInnerClass();
int value = staticInnerClass.getValue();
System.out.println(value);
}
}
可以看出最主要的差别就是内部类会隐式持有一个外部类的引用。
Kotlin中的内部类和嵌套类
在Kotlin中的内部类也是指在一个类的内部声明另一个类,但是和Java中的规则有些差异。
在Kotlin中的内部类和Java中的内部类相似,都会持有一个外部类的引用,但是在Kotlin中内部类的声明方式变化了,必须要使用inner修饰符。
在Kotlin中,没有静态内部类一说,Java中的静态内部类在Kotlin中称为嵌套类。而且默认就是嵌套类,也就是内部类不写任何修饰符就是嵌套类。
同样的,内部类会持有一个外部类的引用,嵌套类不持有外部类的引用。
下面通过代码来说明一下。
Kotlin代码
package kt //外部类
class OutClass{
var count = 0
fun add(){
count++
} //内部类
inner class InnerClass{
fun getSomething(): Int{
//默认持有外部类的引用,直接访问外部类的方法属性
add()
this@OutClass.add()
return this@OutClass.count
}
} //嵌套类
class NestedClass{
fun getValue(): Int{
//嵌套类不持有外部类的引用,必须通过外部类的对象访问
val outClass = OutClass()
outClass.add()
return outClass.count
}
}
} package kt fun main(args: Array<String>){
val outClass = OutClass()
val innerClass = outClass.InnerClass()
val res = innerClass.getSomething()
println(res) val nestedClass = OutClass.NestedClass()
val value = nestedClass.getValue()
println(value)
}
上面的代码是使用Kotlin来实现了一下前面Java的代码,你会发现还是有很多相似之处的。
当然在Koltlin内部类中,可以使用this@OutClass
去访问外部类的属性和方法。
下面我们通过表格来对比一下Java和Kotlin中的内部类。
类A在另一个类B中声明 | 在Java中 | 在Kotlin中 |
---|---|---|
嵌套类(不存储外部类的引用) | static class A | class A |
内部类(存储外部类的引用) | class A | inner class A |
不管是哪个语言,嵌套类都可以直接声明,内部类要被一个外部类的“实例”声明
kotlin中的嵌套类与内部类的更多相关文章
- Java中的嵌套类和内部类
以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很 ...
- python中的嵌套类(内部类调用外部类中的方法函数)
在为书中版本是3.X的,但2.X不太支持直接调用. 所以,在PYTHON2.X中,要在内部类中调用外部类的方法,就必须得实例化外部类,然后,传入实例进行调用. 花了我两个小时啊,资料没找到,自己一个一 ...
- spring 笔记1: mvn 中Controller方法的参数不能是嵌套类(内部类)。
最近做spring开发,个人认为,Controller和客户端js通讯时传递的参数类 只使用某几个方法,为了减少对其他功能的影响,想把参数类定义为Controller类的 嵌套类(内部类).但是实践发 ...
- JAVA 嵌套类和内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...
- 分析java 嵌套类与内部类
一.什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...
- 深入理解java嵌套类和内部类
一.什么是嵌套类及内部类 能够在一个类的内部定义还有一个类.这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用非常少,最重要的是非静态嵌套类,也 ...
- (十二)java嵌套类和内部类
嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...
- 【java开发系列】—— 嵌套类与内部类
嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...
- python中的嵌套类
python中的嵌套类 在.NET和JAVA语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的,今天在python也看到了很不错支持一下.动态语言中很好的嵌套类的实现,应该说嵌套类解决设计问 ...
随机推荐
- Go-25-文件管理
FileInfo接口 package main import ( "fmt" "os" ) // FileInfo 接口文件的信息包括文件名.文件大小.修改权限 ...
- 【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例
当需要通过代码的方式执行PowerShell脚本时,可以参考以下的示例. Azure SDK中提供了两个方法来执行PowerShell脚本 (SDK Source Code: https://gith ...
- 这一篇文章帮你搞定Java(含Java全套资源)
当下想学习Java开发的人越来越多,对于很多零基础的人来说,没有相关的视频教程及相关的学习线路,学起来是一件很费劲的事情,还有很多人从网上及其它渠道购买视频,这些视频资料的价格对于刚毕业的大学生来说也 ...
- surging 如何使用流媒体服务
前言 随着直播行业大火,各种直播类产品和产品层出不穷,能够满足各方人员的需求和互动,也使得斗鱼.虎牙.抖音都随着直播业的大火而欣欣向荣, 大家也对直播平台了解不少,也参与使用,但是怎么样才能研发出视频 ...
- 已知a=a
高中时酷爱经济学. 薄薄的纸片竟然决定着整个社会的运转趋势,整个人生的起伏也是靠着纸片来衡量的. 可笑的是你怎么闹腾也逃不过康波周期等一系列命中注定的路线,即,已知a=a,那么a等于且仅等于a. 所有 ...
- 【目录】python全栈工程师
第一阶段:Python 语言核心编程1. Python核心 -- 2048 游戏核心算法2. 面向对象 -- 天龙八部游戏技能系统3. Python高级 -- 集成操作框架项目:2048游 ...
- 【多线程】Java线程池七个参数详解
/** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * * @param coreP ...
- 提示No input file specified的解决方法
(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi. ...
- hdu2438 三分
题意: 给你个90度的转弯,和一辆标准矩形的车,问你这台车能不能拐过去.. 思路: 求出靠近最里侧的那条边所在的直线(这个图形右下角为坐标原点) y = x * ta ...
- UVA11636复制粘贴
#include<stdio.h> int main() { int Cas = 1 ,n; while(~scanf("%d" ,&n) & ...