scala学习总结2

类与对象:
  • 创建类的基本语法:[修饰符] class 类名{ 类体 }
    注意点:
    ①scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
    ②一个.scala源文件可以包含多个类
  • 成员变量(属性):
    ①Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略
    ②如果赋值为null,则一定要加类型,因为不加类型, 那么该属性的类型就是Null类型
    ③如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值(此时必须标明属性的类型,默认值和Java中一致)
  • 定义对象:
    ①定义对象时一般用val修饰,因为我们一般只修改对象的属性,而不修改对象的引用(地址值)
    ②scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面new 对象类型有继承关系即多态时,则不能省略
  • 类和对象的分配机制:(和Java类似)
  • 构造器:
    • 概述:
      ①scala构建对象需要调用构造器,scala中也可以有多个构造器构成重载;
      ②scala中构造器分为 主构造器辅助构造器
    • 基本语法:
      class 类名(形参列表){ //主构造器
      //类体
      def this(){ } //空参辅助构造器
      def this(形参列表){ }辅助构造器
      }
    • 细节:
      ①主构造器的声明直接放置于类名之后
      ②主构造器会执行类定义中的所有语句,即:构造器也是方法(函数),传递参数和使用方法 和前面的函数部分内容没有区别
      ③如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略
      ④辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)
  • 对象的属性:
    ①JavaBeans规范定义了Java的属性是像getXxx()和setXxx()的方法。许多Java工具(框架)都依赖这个命名习惯。为了Java的互操作性。将Scala字段加**@BeanProperty**时,这样会自动生成规范的 setXxx/getXxx 方法。这时可以使用 对象.setXxx() 和 对象.getXxx() 来调用属性。
    ②注意:给某个属性加入@BeanPropetry注解后,会生成getXXX和setXXX的方法
    并且对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存。
  • 对象被创建的流程:
    ①加载类的信息(属性,方法)
    ②分配内存(堆)
    ③调用父类的构造器
    ④依次调用本类的主、辅构造器
    ⑤返回引用
包:
  • 包的特点概述:
    ①基本语法:package 包名
    ②包的三大作用(和Java一致):
    1.区分相同名字的类;
    2.类很多时更好地管理类;
    3.控制访问范围;
    ③Scala中包名和源码所在的系统文件目录结构要可以不一致,但是编译后的字节码文件路径和包名会保持一致(这个工作由编译器完成)
    ④包名不能为关键字,不能以数字开头
    ⑤scala会自动引入的常用的包:【java.lang.*】【scala】【Predef】

  • 包的注意事项和使用细节:
    ①包可以像嵌套类那样嵌套使用(包中有包)这样的好处是:程序员可以在同一个文件中,将类(class / object)、trait 创建在不同的包中,灵活性很强。
    ②作用域原则:可以直接向上访问。即: Scala中子包中直接访问父包中的内容, 大括号体现作用域,在子包和父包 类重名时,默认采用就近原则,如果希望指定使用某个类,则带上包名即可。
    ③父包要访问子包的内容时,需要import对应的类
    ④可以在同一个.scala文件中,声明多个并列的package(建议嵌套的pakage不要超过3层)

  • 包对象:

    • 基本介绍:
      包可以包含类、对象和特质trait,但不能包含函数/方法或变量的定义。这是Java虚拟机的局 限。为此scala提供了包对象的概念
    • 包底层实现机制分析:
      ①当创建包对象后,在该包下生成public final class package和public final class package$
      ②通过 package$ 的一个静态实例(MODULE$)完成对包对象中的属性和方法的调用
    • 每层包只能有一个包对象
    • 示例:
package com.bigdata{  
  //每个包都可以有一个包对象。你需要在父包(com.bigdata)中定义它,且名称与子包一样。
  package object scala {
      var name = "Curry"
      def sayHi(): Unit = {
      println("Hi Stephen~~~")
    }
  }
  package scala {
    class Test {
        def test() : Unit ={
            //这里的name就是包对象scala中声明的name
            println(name)
            sayHi()//这个sayHi 就是包对象scala中声明的sayHi
        }
    }
  }
}   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值