Scala的面向对象思想和Java有一致性,但语法上有差异且功能更丰富。
Scala包
基本语法:使用 package 包名 来定义包。
包的三大作用 :
区分同名类:当存在多个同名类时,包可以将它们区分开来,避免命名冲突。
管理类:在类数量众多时,通过包来组织和管理类,让代码结构更清晰。
控制访问范围:可以设置包内成员的访问权限,限定哪些代码可以访问包内的类、方法等元素 。
包的命名
命名规则:包名只能由数字、字母、下划线、小圆点组成,不能以数字开头,也不能使用关键字。比如 demo.class.exec1 ( class 是关键字所以错误 )、 demo.12a (数字开头所以错误 )。
命名规范:一般采用小写字母加小圆点的形式,常见格式是 com.公司名.项目名.业务模块名 ,例如 com.zpark.oa.model 、 com.sohu.bank.order
包说明(包语句)
Scala有两种包管理风格。一种和Java类似,每个源文件对应一个包,包名和源文件路径不强制一致,用 . 分隔表示层级,如 com.zpark.scala 。另一种是嵌套风格,像 package com{ package zpark{ package scala{ } } }
包对象
定义
在Scala里,能为每个包定义一个同名的包对象。包对象里定义的成员,是对应包下所有类(class)和单例对象(object)可共享的变量,能被直接访问。例如 package object com { val shareVal = "share" def shareMethod() = {} } ,这里 shareVal 和 shareMethod 可在 com 包下的类和对象中直接使用。
说明
Java包管理风格下 :若采用Java的包管理方式,包对象一般定义在对应包下的 package.scala 文件中,且包对象名要和包名一致 。
嵌套包管理风格下 :要是用嵌套方式管理包,包对象可与包定义在同一文件里,但得保证包对象与包声明处于同一作用域 。例如 package com { object Outer { val out: String = "out" def main(args: Array[String]): Unit = { println(name) } } package object com { val name: String = "com" } } , Outer 对象里能直接访问包对象 com 中定义的 name 。
导包说明
常规导入 :和Java类似,可在文件顶部用 import 导入包,这样文件里所有类都能使用导入包中的内容。
局部导入 :在需要使用相关类或对象的作用范围内进行导入即可 。比如在某个方法内导入特定包,仅在该方法内有效。
通配符导入 :使用 import java.util._ ,可导入 java.util 包下的所有类和对象 。
给类起名(重命名导入) :像 import java.util.{ArrayList=>JL} ,将 java.util.ArrayList 导入并在当前作用域内重命名为 JL 。
导入相同包的多个类 : import java.util.{HashSet, ArrayList} ,一次导入 java.util 包下的多个类 。
屏蔽类 : import java.util.{ArrayList => _} ,表示导入 java.util 包下除 ArrayList 之外的其他内容 。
导入包的绝对路径 : new _root_.java.util.HashMap ,可通过绝对路径导入类,这里 _root_ 是Scala里表示根包的特殊标识 。
类和对象
类可看作模板,对象是类的具体实例 。
定义类
回顾Java中的类 :Java中若类是 public 修饰,类名必须和文件名一致,通常一个 .java 文件有一个 public 类 。而Scala没有 public 修饰,一个 .scala 文件能写多个类 。
基本语法 : [修饰符] class 类名 { 类体 } 。Scala里类默认具有公有可见性 ,无需像Java那样用 public 修饰 。
属性
基本语法 :用 [修饰符] var|val 属性名称 [: 类型] = 属性值 定义属性 。 var 定义的属性可变, val 定义的属性不可变 。使用 @BeanProperty 注解,能自动生成规范的 setXxx/getXxx 方法 。
Scala中的访问权限
说明
与Java对比:Java访问权限有 public 、 private 、 protected 和默认(包访问权限 )。Scala能通过类似修饰符实现类似效果,但存在使用差异。
Scala权限特点
默认权限:Scala中属性和方法默认访问权限为 public ,不过Scala没有 public 关键字。
private 权限:表示私有权限,仅在类内部和伴生对象中可访问。
protected 权限:受保护权限,Scala中比Java更严格,仅同类、子类可访问,同包其他类无法访问。
包访问权限: private[包名] 可增加包访问权限,让指定包名下的其他类也能使用 。
Scala方法定义
基本语法:使用 def 方法名(参数列表) [: 返回值类型] = { 方法体 } 定义方法。 def 是定义方法的关键字,参数列表指定传入参数的名称和类型,返回值类型可省略(编译器能自动推导时 ),方法体包含具体执行逻辑。
创建对象
基本语法:用 val | var 对象名 [: 类型] = new 类型() 创建对象。 val 修饰的对象引用不可变(内存地址不变 ),但对象属性值可变; var 修饰的对象引用和属性值都可变 。
Scala构造器
整体概念
和Java类似,Scala创建对象需调用构造方法,且能有多个构造方法。Scala类的构造器分为主构造器和辅助构造器 。
基本语法
主构造器:定义在类名后的圆括号内,如 class 类名(形参列表) { // 主构造器 // 类体 } ,主构造器的参数会参与类的初始化 。
辅助构造器:使用 def this(形参列表) { // 辅助构造器 } 定义,函数名固定为 this ,可定义多个,编译器依据参数个数和类型区分 。
说明
辅助构造器特征:辅助构造器函数名是 this ,可重载(有多个 ),靠参数个数和类型区分 。
调用规则:辅助构造方法不能独立构建对象,必须直接或间接调用主构造方法 ;构造器调用其他构造器时,被调用的构造器需先声明 。
构造器参数
说明:Scala主构造器函数的形参有三种类型 。未修饰参数是局部变量; var 修饰参数可作为类的可变成员属性; val 修饰参数是类的只读属性 。
封装
原理:封装是将数据和操作数据的方法封装,数据被保护,通过授权操作(成员方法 )访问。
Java与Scala对比:Java通过私有化属性,提供 set 和 get 方法实现封装 。Scala属性底层 public 实际是 private ,通过 get 和 set 方法操作,不推荐照搬Java方式,但为和Java框架兼容,可用 @BeanProperty 注解生成 setXxx/getXxx 方法 。
继承和多态 - 基本语法
使用 class 子类名 extends 父类名 { 类体 } 实现继承 。子类继承父类属性和方法,Scala是单继承(一个子类只能有一个直接父类 )。
Scala 中属性和方法都是动态绑定,而Java 中只有方法为动态绑定