intellij idea安装 Angular ruby selenium file 网络营销推广 管理后台框架 solr索引 java创建字符串数组 linux启动mysql命令 python中get函数 python语言 javalist java文件重命名 学java基础 java怎么编译 java格式化日期 java类方法 java语言运算符 计算机电子书 修改tomcat端口 html特殊符号 eclipse中文版下载 计价软件 七宗罪游戏下载 视频加字幕软件 华为ff dnf瞎子传说套选择 hedit mysql中文乱码 产品修图 微信超额20万怎么办 浣海之核 hdcp功能是什么 sai怎么复制图层 免费录屏工具 mdb是什么文件 什么是默认网关 微信获取用户信息 setbounds
当前位置: 首页 > 学习教程  > 编程语言

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

2021/1/13 20:44:15 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章目录说在前面运行原理代码体现解析说在前面 scala是纯面向对象的语言,C是纯面向过程的语言,Java就是面向过程面向对象的语言。在说到伴生对象之前,要先说到java的static关键字,static关键字修饰的变量、方法可以使类对象共享…

文章目录

  • 说在前面
  • 运行原理
  • 代码体现
  • 解析

说在前面

  • 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="\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伴生对象所属类

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语言中,如果要定义类似java的static内容,都应该放到伴生对象中声明


本文链接: http://www.dtmao.cc/news_show_600434.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?