• 解析scala的伴生类和伴生对象所属类


    @

    说在前面

    • scala是纯面向对象的语言,C是纯面向过程的语言,Java就是面向过程+面向对象的语言。
    • 在说到伴生对象之前,要先说到java的static关键字,static关键字修饰的变量、方法可以使类对象共享,而非某个对象单独拥有,所以是通过类名.变量名/方法名去调用。而这违背了scala面向对象的初衷,因为这没有通过对象去调用

    运行原理

    scala的编译与java大同小异:

    • Java运行原理

      • 先编译,再解释
      • .java源文件--->编译器(javac)--->.class字节码文件--->JVM(java 不同平台)--->机器指令
    • Scala运行原理

      • 先编译,再解释
      • .scala源文件--->编译器(scalac)--->.class字节码文件--->JVM(scala 不同平台)--->机器指令

    代码体现

    观察下面这段代码,Scala01_HelloWorld.scala

    object Scala01_HelloWorld {
    
      def main(args: Array[String]): Unit = {
      
        println("HelloScala")
        
      }
      
    }
    

    经过编译后,可以看见,scala文件编译成了两个.class文件
    在这里插入图片描述
    使用反编译工具打开看看它们:

    Scala01_HelloWorld.class伴生类

    package com.sun.scala.chapter01;
    
    import scala.reflect.ScalaSignature;
    
    @ScalaSignature(bytes="0601):Q!0102	02-	21cU2bY060424g30%fY2|wk34:e25	31A!A05dQ0604H/32:1c)21QAB0106g16fG.31060317!	1a];o2505I21aA2p[160101C010716330521a!02032103y!!E*dC2f07'M0IK2dwnV8sIN21Q0205	03#Mi21A05060213%21AC05020703:L(+324	13YiA21Af02
    qJg.33;?)05Y01"B
    16	03Q2201B7bS:$"a07202105Ea22BA17230521)f.33;	13}A0231012102	0524xm35	04#053223B0122230525	%O]1z!	!sE040222K%21aEE0107!J,G-324
    05!J#AB*ue&twM0302'%01")
    public final class Scala01_HelloWord
    {
    
      public static void main(String[] paramArrayOfString)
      {
        Scala01_HelloWord..MODULE$.main(paramArrayOfString);
      }
      
    }
    

    Scala01_HelloWorld$.class伴生对象所属类

    package com.sun.scala.chapter01;
    
    import scala.Predef.;
    
    public final class Scala01_HelloWord$
    {
      public static final  MODULE$;
    
      static
      {
        	new ();
      }
    
      public void main(String[] args)
      {
        	Predef..MODULE$.println("hello,scala");
      }
      
      private Scala01_HelloWord$() 
      { 
      		MODULE$ = this; 
      }
    
    }
    

    解析

    • object 名称
      从语法角度讲,上面语法表示声明了一个伴生对象
      Scala是纯面向对象的,去除了java中的static关键字,通过伴生对象模拟static的效果(类名.变量名/方法名
    • 伴生对象
      • 伴随着某个类产生的一个对象
      • 当我们对源文件进行编译之后,默认会生成两个字节码文件,一个是伴生类,另一个是伴生对象所属类
      • 真正的伴生对象是伴生对象所属类中创建的单例对象
      • 如果不想默认生成伴生类,可以手动生成,要求伴生类名称和伴生对象名称一致
      • 所以在scala程序中,如果要想实现static效果,那么我们应该使用object关键字将属性以及方法定义在伴生对象类中
  • 相关阅读:
    搜索入门
    计算几何基础
    对“学生自行组队,共同完成实验”的一些思考感慨
    20145213《信息安全系统设计》第十一周学习总结
    20145213《信息安全系统设计基础》第十周学习总结
    记与舍友摩擦的一两事儿
    20145213《信息安全系统设计》第九周学习总结下篇
    20145213《信息安全基础设计》第九周学习总结上篇
    20145213《信息安全设计系统》实验报告一
    20145213《信息安全系统设计基础》第八周学习总结下篇
  • 原文地址:https://www.cnblogs.com/sunbr/p/14274339.html
Copyright © 2020-2023  润新知