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中的嵌套类与内部类的更多相关文章

  1. Java中的嵌套类和内部类

    以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很 ...

  2. python中的嵌套类(内部类调用外部类中的方法函数)

    在为书中版本是3.X的,但2.X不太支持直接调用. 所以,在PYTHON2.X中,要在内部类中调用外部类的方法,就必须得实例化外部类,然后,传入实例进行调用. 花了我两个小时啊,资料没找到,自己一个一 ...

  3. spring 笔记1: mvn 中Controller方法的参数不能是嵌套类(内部类)。

    最近做spring开发,个人认为,Controller和客户端js通讯时传递的参数类 只使用某几个方法,为了减少对其他功能的影响,想把参数类定义为Controller类的 嵌套类(内部类).但是实践发 ...

  4. JAVA 嵌套类和内部类

    一.什么是嵌套类及内部类?  可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:  静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类, ...

  5. 分析java 嵌套类与内部类

    一.什么是嵌套类及内部类?     可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类 ...

  6. 深入理解java嵌套类和内部类

    一.什么是嵌套类及内部类 能够在一个类的内部定义还有一个类.这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用非常少,最重要的是非静态嵌套类,也 ...

  7. (十二)java嵌套类和内部类

    嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...

  8. 【java开发系列】—— 嵌套类与内部类

    嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...

  9. python中的嵌套类

    python中的嵌套类 在.NET和JAVA语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的,今天在python也看到了很不错支持一下.动态语言中很好的嵌套类的实现,应该说嵌套类解决设计问 ...

随机推荐

  1. (十一)Docker-DinD

    1. Docker in Docker Step 1. Start a daemon instance $ docker run --privileged --name some-docker -d ...

  2. JAVAEE_Servlet_13_HttpServlet

    HttpServlet 因为每次执行前端请求,都需要获取前端的请求方式,都需判断前端的请求方式和后端是否一致,随意这段代码就可以封装起来. 写一个HttpServlet类去继承GenericServl ...

  3. kubectl 缩写和别名

    Use "kubectl explain " for a detailed description of that resource (e.g. kubectl explain p ...

  4. Java基础(面试复习整理)

    基础知识和语法 Java语言初识 计算机语言发展 机器语言.汇编.C.C++.Java Java的诞生与发展 1995 JavaSE JavaME Android JavaEE 2006(大数据) H ...

  5. Typora+PicGo+cos图床打造开发者文档神器

    一.Typora简介 markdown简单.高效的语法,被每一个开发者所喜爱.Typora又是一款简约.强悍的实时渲染markdown编辑器.本文将介绍Typora搭配PicGo与腾讯cos对象存储( ...

  6. 缓冲区溢出分析第09课:MS06-040漏洞研究——深入挖掘

    前言 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案是否 ...

  7. Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3.1  汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov  eax,5  ;5送EAX寄存器 add   ...

  8. 【JavaScript】Leetcode每日一题-递增顺序搜索树

    [JavaScript]Leetcode每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...

  9. springboot优雅的异常处理

    springboot全局异常处理 @ControllerAdvice 尽管springboot会对一些异常进行处理,不过对于开发者来说,这还不太便于维护,因此我们需要自己来对异常进行统一的捕获与处理. ...

  10. 异步阻塞,Manager模块,线程

    一.异步阻塞 1.并没有按照执行顺序等待结果 2.而是所有的任务都在异步执行着 3.但是我要的结果又不知道谁的结果先来,谁先结束我就先取谁的结果 很明显的异步,大家都相互执行着(异步过程),谁先结束我 ...