广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中的Kotlin 内部类原理
  • 902
分享到

Java中的Kotlin 内部类原理

2024-04-02 19:04:59 902人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录Java 中的内部类OutterJava.classInnJava.classKotlin 中的内部类总结Java 中的内部类 这是一个 Java 内部类的简单实现: publi

Java 中的内部类

这是一个 Java 内部类的简单实现:

public class OutterJava {
    private void printOut() {
        System.out.println("AAA");
    }
​
    class InnJava {
        public void printInn() {
            printOut();
        }
    }
}

外部类是一个私有方法,内部类为什么可以访问到外部类的私有方法呢?思考这个问题,首先要从它的字节码入手,看看 JVM 到底对 java 文件做了什么。

字节码分析流程是:

  • javac xxx.java生成 class 文件。
  • javap -c xxx.class对代码进行反汇编,可以生成可查看的代码内容。

通过 javac 命令生成 class 文件,此时会发现生成了两个 class 文件,一个外部类 OtterJava 的,一个内部类 InnJava 的。

OutterJava.class

OutterJava.class 反汇编后的代码如下所示,这里面除了一个构造方法,多生成了一个

Compiled from "OutterJava.java"
public class java.OutterJava {
  public java.OutterJava();
    Code:
       0: aload_0
       1: invokespecial #2                  // Method java/lang/Object."<init>":()V
       4: return
​
  private void printOut();
    Code:
       0: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #4                  // String AAA
       5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
​
  static void access$000(java.OutterJava);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method printOut:()V
       4: return
}

从反编译出来的内容来看,多了一个静态的access$000(OutterJava)方法,它的内部调用了 printOut()

InnJava.class

Compiled from "OutterJava.java"
class java.OutterJava$InnJava {
  final java.OutterJava this$0;
​
  java.OutterJava$InnJava(java.OutterJava);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #1                  // Field this$0:Ljava/OutterJava;
       5: aload_0
       6: invokespecial #2                  // Method java/lang/Object."<init>":()V
       9: return
​
  public void printInn2();
    Code:
       0: aload_0
       1: getfield      #1                  // Field this$0:Ljava/OutterJava;
       4: invokestatic  #3                  // Method java/OutterJava.access$000:(Ljava/OutterJava;)V
       7: return
}

在 InnJava 的字节码反编译出来的内容中,主要有两个点需要注意:

  • 构造方法需要一个外部类参数,并把这个外部类实例保存到了this$0中。
  • 调用外部类私有方法,实际上是调用了OutterJava.access$000方法。

小结:

在 Java 中,内部类与外部类的关系是:

  • 内部类持有外部类的引用,作为内部构造参数传入外部类实例,并保存到了内部类的属性this$0中。
  • 内部类调用外部类的私有方法,实际上是外部类生成了内部实际调用私有方法的静态方法access$000,内部类可以通过这个静态方法访问到外部类中的私有方法。

Kotlin 中的内部类

同样的 Java 代码,用 Kotlin 实现:

class Outter {
    private fun printOut() {
        println("Out")
    }
​
    inner class Inner {
        fun printIn() {
            printOut()
        }
    }
}

这里如果不加inner关键字,printIn()内的printOut()会报错Unresolved reference: printOut 。

不加inner关键字,反编译后的字节码:

public final class java/Outter$Inner {
  // ...
  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ljava/Outter$Inner; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
  // ...
}

不加inner关键字,内部类的构造方法是没有外部类实例参数的。如果加上inner,就和 Java 一样:

  // 加上了 inner 的构造方法
  public <init>(Ljava/Outter;)V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    ALOAD 1
    PUTFIELD java/Outter$Inner.this$0 : Ljava/Outter;
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ljava/Outter$Inner; L0 L1 0
    LOCALVARIABLE this$0 Ljava/Outter; L0 L1 1
    MAXSTACK = 2
    MAXLOCALS = 2

而内部类对于外部类私有方法的访问,也是通过静态方法access$XXX来实现的:

  public final static synthetic access$printOut(Ljava/Outter;)V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/Outter.printOut ()V
    RETURN
   L1
    LOCALVARIABLE $this Ljava/Outter; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

总结

在 Kotlin 中,内部类持有外部类引用和通过静态方法访问外部类私有方法都是与 Java 一样的。唯一的不同是,Kotlin 中需要使用 inner关键字修饰内部类,才能访问外部类中的内容。实质是inner关键字会控制内部类的构造方法是否带有外部类实例参数。

到此这篇关于Java中的Kotlin 内部类原理的文章就介绍到这了,更多相关Java Kotlin 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中的Kotlin 内部类原理

本文链接: https://www.lsjlt.com/news/151694.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的Kotlin 内部类原理
    目录Java 中的内部类OutterJava.classInnJava.classKotlin 中的内部类总结Java 中的内部类 这是一个 Java 内部类的简单实现: publi...
    99+
    2022-11-13
  • 如何理解Java内部类中的局部内部类
    这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或...
    99+
    2023-06-05
  • 如何理解Java内部类中的匿名内部类
    如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名...
    99+
    2023-06-05
  • 如何理解Java内部类中的成员内部类
    如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的...
    99+
    2023-06-05
  • java外部类与内部类怎么理解
    本篇内容主要讲解“java外部类与内部类怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java外部类与内部类怎么理解”吧! 一、内部类内部类就是将一个类A定义在类B里边,里边的...
    99+
    2023-06-22
  • java中内部类出现内存泄漏的原因是什么
    这篇文章给大家介绍java中内部类出现内存泄漏的原因是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序...
    99+
    2023-06-14
  • 浅谈Java中的内部类
    最近在讲Java中的内部类,感觉内部类实际上对于初学者用得不多,那么内部类简单的说,其实就是在一个类的内部定义的类。按照定义的情况分为:成员内部类,局部内部类,静态内部类,匿名内部类。成员内部类,就是定义一个当作类的成员变量的类。局部内部类...
    99+
    2023-06-02
  • java中内部类的类型有哪些
    java中内部类的类型有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式...
    99+
    2023-06-14
  • java中什么是局部内部类
    这篇文章将为大家详细讲解有关java中什么是局部内部类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3....
    99+
    2023-06-14
  • Java的内部类总结
    目录前言一,成员内部类1,成员内部类的特点2,成员内部类的实现3,内部类和外部类的关系二,静态内部类1,静态内部类的特点2,比较成员内部类和静态内部类3,静态内部类的实现三,方法内部...
    99+
    2022-11-12
  • Java中内部类是什么
    这篇文章给大家分享的是有关Java中内部类是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。所谓内部类就是在类的内部申明另一个类,因为只有当前类能够访问到内部类,所以内部类相对来说是非常安全的,另外内部类可以继...
    99+
    2023-06-17
  • 详解Java 中的嵌套类与内部类
    详解Java 中的嵌套类与内部类在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类。其中内部类又...
    99+
    2023-05-31
    java 嵌套类 内部类
  • 深入理解Java嵌套类和内部类
     一、什么是嵌套类及内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌...
    99+
    2023-05-31
    java 嵌套类 内部类
  • java匿名内部类主要原则是什么
    Java匿名内部类的主要原则是为了减少代码的冗余,提高代码的可读性和简洁性。通过使用匿名内部类,可以将一些简单的类定义和实现直接嵌入...
    99+
    2023-10-07
    java
  • 一文带你真正理解Java中的内部类
    目录概述内部类介绍和分类常规内部类局部内部类匿名内部类静态内部类静态内部类和普通内部类的区别内部类的作用概述 不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么...
    99+
    2022-11-13
  • java 中的内部类如何使用
    这篇文章将为大家详细讲解有关java 中的内部类如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java 中内部类的实例详解一:内部类可直接访问外部类的成员变量,包括外部类私有的成员变...
    99+
    2023-05-31
    java ava
  • Java中的内部类你了解吗
    目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs...
    99+
    2022-11-13
  • Java中的内部类怎么学习
    这篇文章的内容主要围绕Java中的内部类怎么学习进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!看了很多源码,都有用到内部类,但是自己以前在生产环境上...
    99+
    2023-06-16
  • Java中的内部类使用详情
    目录一,内部类访问成员二,访问内部类成员1,直接访问内部类的中的成员2,访问成员一,内部类访问成员 1,内部类可以直接访问外部类的成员,包括私有。2,外部类要访问内部类,必须建立内部...
    99+
    2022-11-13
  • java中的匿名内部类总结
     java中的匿名内部类总结匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法ab...
    99+
    2023-05-31
    java 匿名 内部类
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作