1.26
class & object
声明类的基本语法形式
[private] [final|sealed] [abstract] class ClassName [private] ([private] val|var] name1:Type1...) [extends SuperClassOrTrait[(superClassConstructorArg1,...)] [with trait1,...]] {}
相对于java,scala class声明没有public(事实上public也不关键字),类默认公有,一个.scala文件中可以声明多个类(但一般仍建议文件对应类)。
abstract class定义抽象类,final class定义不可被继承类,sealed class定义的类不允许在同文件外地方被继承。
类字段和方法 fields & methods
无参函数(方法)可定义为带括号和不带括号两种形式,一般将不会改变实例状态、无副作用的方法(immutator)定义为无括号形式,会改变实例状态、有副作用的(mutator)定义为带括号形式。无括号函数调用时必须不带括号调用,带括号函数调用时可带括号也可不带,但一般地,不带括号调用会隐含方法不会改变实例状态、无副作用之意义。
class Counter{
private var i = 0
def current = i
def get() = i
def increment() = i+=1
// def incre2 = i+=2 // NOT recommended, mutable method should NOT be parenthesis-less
}
object app extends App{
val n = new Counter
n.increment() // OK
//n.increment // compilation ERROR
n.current // OK, better than .current()
n.current() // OK
}
scala class成员默认是公有的(事实上scala偏向默认公有设计,同时没有public关键字),可以声明私有private
或保护型protected
。
字段定义时,val声明只读字段,var声明可读写字段。读方法"getter"(类似java中getXxx)方法名同字段名,写方法"setter"(类似java中setXxx)方法名为<字段名>_=
(在jvm中不能有等号故为 _$eq
)。即声明的公有字段时除了类内保存数据的私有字段,对于公有val字段蕴含"getter"(同方法名),对于公有var字段蕴含"getter"和"setter"(方法名<字段名>_=
)。声明私有变量通过加private实现;对本实例外私有通过private[this]语法实现(类的其他实例也无法访问);声明对嵌套类可访问,private[<类名>];也可声明对某个包内可访问(包外不可访问)私有型,通过private[<包名>]实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统