日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scala学习之类和属性篇(一):定义类的主构造方法

發(fā)布時間:2025/5/22 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala学习之类和属性篇(一):定义类的主构造方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

在Scala中直接在類名后面跟上參數(shù),即可定義類的主構造方法。

scala> :paste // Entering paste mode (ctrl-D to finish)class Person(var firstName: String, var lastName:String) {println("The construct begins.")var age = 18println(this)println("The construct ends.")override def toString = s"$firstName $lastName is $age years old." }// Exiting paste mode, now interpreting.defined class Person

接下來我們通過主構造方法來實例化這個類,看看發(fā)生了什么。所有定義在類體內(nèi)部的可執(zhí)行性代碼都被執(zhí)行了,也就是說整個類內(nèi)部都是這個主構造方法的方法體。

scala> val p = new Person("wang", "wei") The construct begins. wang wei is 18 years old. The construct ends. p: Person = wang wei is 18 years old.

至此,主構造方法的參數(shù)和方法體部分都已經(jīng)說明了。

接下來我們嘗試訪問一下類的幾個屬性,你會發(fā)現(xiàn)可以直接用類名加屬性名來訪問。

scala> p.firstName res4: String = wangscala> p.lastName res5: String = weiscala> p.age res6: Int = 18

由于所有屬性都是使用var關鍵字來定義的,所以我們可以改變他們的值。

scala> p.firstName = "Li" p.firstName: String = Liscala> p.lastName = "Ming" p.lastName: String = Mingscala> p.age = 20 p.age: Int = 20scala> println(p) Li Ming is 20 years old.

接下來我們討論一下主構造方法中參數(shù)的可見性問題。

使用var修飾的主構造方法參數(shù),因為是可變的所有Scala會自動為其生成get和set方法。

scala> class Person(var name: String) defined class Personscala> val p = new Person("Ming"); p: Person = Person@25d3cfc8scala> p.name res8: String = Mingscala> p.name = "Ning" p.name: String = Ningscala> p.name res9: String = Ning

使用val修飾的主構造方法參數(shù),因為是不可變的所有Scala不會為其生成set方法。

scala> class Person(val name: String) defined class Personscala> val p = new Person("Ming") p: Person = Person@5edc70edscala> p.name res10: String = Mingscala> p.name = "Ning" <console>:13: error: reassignment to valp.name = "Ning"^

不適用val或者var關鍵字修飾的主構造方法參數(shù),Scala將采取最嚴格的訪問限制,set和get方法都不會被提供,并且這個參數(shù)是不可變的。

scala> class Person(name: String) defined class Personscala> val p = new Person("Ming") p: Person = Person@36aa52d2scala> p.name <console>:14: error: value name is not a member of Personp.name^scala> p.name = "Ning" <console>:15: error: value name is not a member of Person val $ires8 = p.name^ <console>:13: error: value name is not a member of Personp.name = "Ning"^

如果強行為無關鍵字修飾的主構造方法參數(shù)添改變其值的方法,會導致編譯報錯。

scala> :paste // Entering paste mode (ctrl-D to finish)class Person(name: String) {def getName = println(name)def setName(_name: String) { this.name = _name } }// Exiting paste mode, now interpreting.<console>:13: error: reassignment to valdef setName(_name: String) { this.name = _name }^

在val或者var關鍵字前面加上private關鍵字,那么Scala同樣不會為這個參數(shù)生成get和set方法。那么我們?nèi)绻攵x一個可變但不可訪問的參數(shù)該怎么辦呢:private var?argument。這樣Scala不會為其生成set和get方法,但是你可以在類的內(nèi)部自定義一些方法來改變這個參數(shù)的值。

scala> :paste // Entering paste mode (ctrl-D to finish)class Person(private var name: String) {def printName = println(name)def setName(_name: String) { this.name = _name } }// Exiting paste mode, now interpreting.defined class Personscala> val p = new Person("Ming") p: Person = Person@5d342959scala> p.printName Mingscala> p.setName("Ning")scala> p.printName Ning

總結:主構造方法參數(shù)可見性一共有這么幾種

  • 使用var修飾:Scala會為其生成get和set方法。
  • 使用val修飾:Scala會為其生成get方法。
  • 不使用修飾:Scala不會為其生成get和set方法,并且參數(shù)值不可改變。(效果等同于private val)
  • 使用private修飾:Scala不會為其生成get和set方法,但參數(shù)可變性由var和val來決定。

注意:使用case class來定義的類的主構造方法參數(shù),如果你不適用任何修飾默認使用val修飾。

scala> case class Person(name: String) defined class Personscala> val p = new Person("Ming") p: Person = Person(Ming)scala> p.name res15: String = Mingscala> p.name = "Ning" <console>:14: error: reassignment to valp.name = "Ning"^

?

轉載于:https://my.oschina.net/nenusoul/blog/802244

總結

以上是生活随笔為你收集整理的Scala学习之类和属性篇(一):定义类的主构造方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。