前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >解析scala的伴生类和伴生对象所属类

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

作者头像
孙晨c
发布2021-01-18 10:12:00
发布2021-01-18 10:12:00
84700
代码可运行
举报
文章被收录于专栏:无题~无题~
运行总次数:0
代码可运行

@

目录

说在前面

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

运行原理

scala的编译与java大同小异:

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

代码体现

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

代码语言:javascript
代码运行次数:0
运行
复制
object Scala01_HelloWorld {

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

经过编译后,可以看见,scala文件编译成了两个.class文件

使用反编译工具打开看看它们:

Scala01_HelloWorld.class,伴生类

代码语言:javascript
代码运行次数:0
运行
复制
package com.sun.scala.chapter01;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001):Q!\001\002\t\002-\t\021cU2bY\006\004\024g\030%fY2|wk\034:e\025\t\031A!A\005dQ\006\004H/\032:1c)\021QAB\001\006g\016\fG.\031\006\003\017!\t1a];o\025\005I\021aA2p[\016\001\001C\001\007\016\033\005\021a!\002\b\003\021\003y!!E*dC2\f\007'M0IK2dwnV8sIN\021Q\002\005\t\003#Mi\021A\005\006\002\013%\021AC\005\002\007\003:L(+\0324\t\013YiA\021A\f\002\rqJg.\033;?)\005Y\001\"B\r\016\t\003Q\022\001B7bS:$\"a\007\020\021\005Ea\022BA\017\023\005\021)f.\033;\t\013}A\002\031\001\021\002\t\005\024xm\035\t\004#\005\032\023B\001\022\023\005\025\t%O]1z!\t!sE\004\002\022K%\021aEE\001\007!J,G-\0324\n\005!J#AB*ue&twM\003\002'%\001")
public final class Scala01_HelloWord
{

  public static void main(String[] paramArrayOfString)
  {
    Scala01_HelloWord..MODULE$.main(paramArrayOfString);
  }
  
}

Scala01_HelloWorld$.class,伴生对象所属类

代码语言:javascript
代码运行次数:0
运行
复制
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关键字将属性以及方法定义在伴生对象类中
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说在前面
  • 运行原理
  • 代码体现
  • 解析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档