zoukankan      html  css  js  c++  java
  • 解析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关键字将属性以及方法定义在伴生对象类中
  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/sunbr/p/14274339.html
Copyright © 2011-2022 走看看