scala安装和初步认识(class和object区别)

本文介绍了Scala的安装步骤,以及如何配置环境变量。接着深入探讨了`class`和`object`在编译后的底层实现,指出`class`修饰的类会产生一个字节码文件,而`object`修饰的类会有两个,包括一个`.class`文件和一个`$$.class`文件。文章通过反编译工具展示了`main`方法在两种情况下的不同,解释了`object`的执行流程,强调了其面向对象的特性。
摘要由CSDN通过智能技术生成

scala安装和初尝试

安装好scala后,配置环境变量,然后开启一个新的scala,并且添加Scala框架支持
在这里插入图片描述
然后将scala的目录设置为源目录,这样才会自动编译
在这里插入图片描述
在这里插入图片描述

代码解析

1.Scala语言是一门完全面向对象的语言.
  * 2.Java是一门面向对象的语言, 例如: 基本数据类型 、 static语法 等等.
  *
  * 3. object: 因为Scala中没有static的语法, 所以在底层执行的时候,通过object模拟java的static语法.
  *
  * 4. def : define的缩写,用于声明函数(方法)
  *
  * 5. 方法形参:
  *    Java  => String[]  args       =>  参数类型  参数名     =>  我爱上了一个女人,她叫翠花
  *    Scala => args: Array[String]  =>  参数名 :  参数类型   =>  我爱上了翠花, 她是个女人
  *    [String] => Scala中的泛型
  *
  * 6. 方法声明:
  *    Java  =>  void  main()  => 返回值类型  方法名
  *    Scala =>  main(): Unit  => 方法名 : 返回值类型
  *
  * 7. 无返回值类型:
  *    Java  =>  void(关键字) => 不是面向对象的
  *    Scala =>  Unit()     => 面向对象   => Unit只有一个值  =>  ()
  *
  * 8. = : 赋值 ,Scala中函数也是对象,可以被赋值.
  *
  * 9. {} : 函数体(方法体)
  *
  * 10. println("Hello Scala") :  Scala会默认导入一些对象. 例如 Predef,println其实是某个对象的方法,这个对象就是Predef,但是可以不写它,所以本质其实是调用了Predef的println方法,所以可以println()等同于Predef.println()

底层实现原理

将scala代码编译之后
在这里插入图片描述
再通过反编译工具就可以得到它的字节码文件,然后就可以观察它的底层结构

通过class修饰的类编译后只会产生一个字节码文件

当在类中添加main方法后, 编译后发现就是一个普通的成员方法.

通过object修饰的类编译后会出现两个字节码文件,分别是:

  • 类名.class

  • 类名$.class

  • 光创建空类后类名$.class中就有的东西:

  •  1. 当前类型的static变量
    
  •     public static com.atguigu.scala.chapter01.Scala02_object$ MODULE$;
    
  •  2. 静态代码块,创建了当前类的对象
    
  •     public static { new Scala02_object$ };
    
  •  3. 私有构造器, 将当前类的对象赋值给 当前类的静态属性
    
  •   private Scala02_object$()
    
  •    {
    
  •      MODULE$ = this;
    
  •    }
    
  • 当在类中添加main方法后:

  • 类名.class => public static void main(String[] paramArrayOfString){

  •                Scala02_object$.MODULE$.main(paramArrayOfString);
    
  •             }
    
  • 类名$.class => public void main(String[] args){}
    在这里插入图片描述

  • 当在main方法中添加语句后:

  • 所添加的语句出现在了 类名$.class 中的普通 main方法中.

*执行流程: 类名.class -> static main -> 类名 . c l a s s . M O D U L E .class.MODULE .class.MODULE -> 类名$.class.main

也就是说,当我们在object修饰的类中每创建一个方法,都会在类名.class中生成这个方法的静态方法,在类名 . c l a s s 中 生 成 这 个 方 法 的 普 通 方 法 , 然 后 类 名 . c l a s s 的 静 态 方 法 中 在 通 过 类 名 .class中生成这个方法的普通方法,然后类名.class的静态方法中在通过类名 .class.class.class的对象来调用类名$.class中的普通方法
这样就实现了完全面向对象

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值