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[<包名>]实现。

posted @   秋渡晚枫  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示