zoukankan      html  css  js  c++  java
  • Scala 代码底层 demo 理解

    scala或者Java代码最终都会编译成JVM可识别的*.class 格式的二进制字节码,*.class 文件可用 jd-gui 软件打开。

    举例一

    aiguigu.scala 文件 用 scalac aiguigu.scala 该文件后 由于目标是object,scalac编译器会自动创造两个文件( aiguigu.class、 aiguigu$.class  )

    object aiguigu{
      def main(args: Array[String]): Unit = {
        println("123")
      }
    }
    //aiguigu.scala
    
    import scala.reflect.ScalaSignature;
    
    @ScalaSignature(bytes="060125:Q!0102	0225	q!Y5hk&<WOC01040335aT-349usz320101050207175	!AB03	05!0521BA04bS36,30nZ;240535Q01CA06173305a!"A070213M3427
    \1
    05=a!AB!osJ+g
    C0322172105!#0104=S:LGO20130213!)Ac02C01+05!Q.Y5o)	122040502f/%210104040205+:LG17C0333'01071$0103be3634cA0635=%21Q0404020603J2430-37	03?	r!a0321
    0505b21A02)sK22,g-0302$I	111336:j]36T!!	07")
    public final class aiguigu
    {
      public static void main(String[] paramArrayOfString)
      {
        aiguigu$.MODULE$.main(paramArrayOfString);
      }
    }
    //aiguigu.class 反编译结果如上
    
    import scala.Predef.;
    
    public final class aiguigu$
    {
      public static final  MODULE$;
      
      static
      {
        new ();
      }
      
      public void main(String[] args)
      {
        Predef$.MODULE$.println("123");
      }
      
      private aiguigu$()
      {
        MODULE$ = this;
      }
    }
    //  aiguigu$.class 文件反编译结果如上

    通过上面编译发现, 当我们单独定义一个 object  类型的时候,scalac 编译器会自动构建类,然后接下来的思路也是 跟Java那套类似。

    举例二

    比如我们定义个如下的scala文件,scala  中的属性A定义其实还是private的在底层,只不过是在我们创建的时候系统自动搞了一个A(), A_$eq() 举例如下

    
    object CatDemo{
      def main(args: Array[String]): Unit = {
        val cat = new Cat  //  创建一只猫
        cat.name = "小白" //  其实不是直接访问的属性,而是 cat.name_$eq("小白")
        println(cat.name) // 等价于cat.name()
        cat age = 10
        cat.color = "白色"
        printf("小猫信息如下:%s %d %s",cat.name,cat.age,cat.color)
      }
    }
    // 定义一个类Cat,一个class Cat 对应的字节码文件只有一个Cat.class 默认是public
    class Cat {
      // 当我们生命 var name:String 时 底层对应的 private name  同事自动生成两个public方法, name() 类似 getter , name_$eq() 类似setter
      var name:String = ""
      var age:Int = _ // _ 会自动赋值给该变量的默认值
      var color:String = ""
    }
    
    

    上面文件编程后 会生成 Cat.class、CatDemo.class、 CatDemo$.class 两个文件,细节如下

    举例三

    scala代码,跟仿scala的Java代码如下。 

    object Hello2{
      def main(args: Array[String]): Unit = {
        println("hello,scala")
      }
    }
    //aiguigu.scala
    

    scala 一个文件可以定义若干类,每个类都会编译成一个.class 文件,只是为了了解底层而已,知其所以然

    关注公众号 海量干货等你
  • 相关阅读:
    linux mysql添加用户名并实现远程访问
    bootstrap-datetimepicker时间控件的使用
    jquery图片左右来回循环飘动
    jquery 全选获取值
    设置linux编码utf-8
    nginx 自签名https
    Laravel 邮件配置
    memcachq队列安装
    开发与运维使用常用工具
    composer配置和安装php框架
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734174.html
Copyright © 2011-2022 走看看