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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

發布時間:2024/9/27 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 類

1.1. 類的定義

package cn.toto.scala.day2/*** 在Scala中,類并不用聲明為public類型的。* Scala源文件中可以包含多個類,所有這些類都具有共有可見性。* Created by toto on 2017/6/29.*/ class Person {//用val修飾的變量是可讀屬性,有getter但沒有setter(相當與Java中用final修飾的變量)val id = "9527"//用var修飾的變量都既有getter,又有settervar age : Int = 18//類私有字段,只能在類的內部使用private var name : String = "toto"//對象私有字段,訪問權限更加嚴格的,Person類的方法只能訪問到當前對象的字段//在伴生對象里面也不可以訪問,這里相當于是java中private的,沒有getter和setter的方法private[this] var pet = "小強"def sayHi() : Unit = {//下面的運行結果是:9527println(id)//下面的結果是:18println(age)//說明在自己的類中可以訪問到,下面的運行結果是:totoprintln(name)//說明只有在類里面可以訪問到private[this]類型的變量,下面的運行結果是"小強",說明已經被修改了。println(pet)} }/*** 這個名字和類名相同,叫伴生對象*/ object Person {//在伴生變量中定義的變量相當于就是靜態變量var i = 1//在伴生變量中定義的方法相當于是靜態方法def main(args: Array[String]): Unit = {//結果是:1println(i)val p = new Person()//如果是下面的修改,發現下面有紅線,說明val類型的不支持重新賦值//p.id = "123"//下面的結果是:9527println(p.id)//下面的結果是:18println(p.age)p.age = 27//下面的結果是:27println(p.age)//下面的結果是:唐伯虎println(p.name)p.name = "toto"//這里說明可以在伴生對象中訪問到私有的變量//下面的結果是:totoprintln(p.name)p.sayHi()} }object Test {def main(args: Array[String]): Unit = {var p = new Person()//運行結果是18println(p.age)//運行結果是:9527println(p.id)/*** 下面的運行結果是:* 9527* 18* 唐伯虎* 小強*/p.sayHi()//這里不可以直接通過p.pet訪問到。//這里面也不可以訪問到p.name} }

1.2. 構造器

注意:主構造器會執行類定義中的所有語句

package cn.toto.scala.day2import java.io.IOException/*** Created by toto on 2017/6/29.** 構造器參數可以不帶val或var,如果不帶val或var的參數至少被一個方法所使用* 那么它將被提升為字段** 跟類名交織在一起的叫 主構造器* val定義的只能讀不能改(成員變量)* var 可以讀,有了默認值,在傳參的時候,可以不傳參了。* faceValue :可以通過這個為它初始賦值,有了默認值,可以不傳參了,相當于private[this],只能在類的內部使用*/ class Student(val name : String,var age:Int,faceValue:Double = 99.9,private var height : Int = 18) {//主構造器會執行類定義中的所有語句println("執行主構造器")//faceValue被下面的方法使用后,faceValue就變成了不可變的對象私有字段了,等同于private[this] val faceValue//如果沒有被方法使用該參數將不被保存為字段,僅僅是一個可以被主構造器中的代碼訪問的普通參數def description = name + " is " + age + " years old,顏值是:" + faceValue//定義為輔構造函數用private[this] var gender : String = nulltry {println("讀取文件");throw new IOException("io exception");} catch {case e:NullPointerException => println("打印異常Exception:" + e)case e:IOException => println("打印異常Exception:" + e)}def show() : Unit = {//faceValue = 1000println(faceValue)}//用this關鍵字定義輔助構造器//輔助構造器 def this (參數)def this(name : String,age : Int,gender: String) {//每個輔助構造器必須以主構造器或其他的輔助構造器的調用開始//第一行必須先調用主構造器this(name,age)println("執行輔助構造器")println("faceValue:" + this.faceValue)println("height:" + this.height)//對于沒法在主構造器中定義的變量,可以定義一個私有字段this.gender = genderprintln("gender:" + this.gender)} }object Student {def main(args: Array[String]): Unit = {/*** 私有的構造器,只有在其伴生對象中使用** 下面立即執行出結果:* 執行主構造器* 讀取文件* 打印異常Exception:java.io.IOException: io exception*/val p = new Student("toto", 27, 100, 180)//運行結果是:27println(p.age)//運行結果是:totoprintln(p.name)p.age = 18p.height = 199;//運行結果是:18println(p.age)//運行結果是:199println(p.height)//運行對的結果是:toto is 18 years old,顏值是:100.0println(p.description)var per = new Personprintln(per)} }object Main {def main(args: Array[String]): Unit = {/*** 理解執行出結果:* 執行主構造器* 讀取文件* 打印異常Exception:java.io.IOException: io exception*/val stu1 = new Student("toto",30)//只是:toto,說明調用的不是輔助構造器println(stu1.name)/*** 調用的時候就立即顯示:* 執行主構造器* 讀取文件* 打印異常Exception:java.io.IOException: io exception* 執行輔助構造器* faceValue:99.9* height:18* gender:男*/var stu2 = new Student("toto",27,"男")println(stu2.age)println(stu2.name)//下面的取不到//println(stu2.height)//下面的也獲取不到//println(faceValue);} }

1.3. 單例對象

在Scala中沒有靜態方法和靜態字段,但是可以使用object這個語法結構來達到同樣的目的
1.存放工具方法和常量
2.高效共享單個不可變的實例
3.單例模式

package cn.toto.scala.day2import scala.collection.mutable.ArrayBufferobject SingletonDemo {def main(args: Array[String]) {//單例對象,不需要new,用【類名.方法】調用對象中的方法val session = SessionFactory.getSession()//獲得結果:cn.toto.scala.day2.Session@96532d6println(session)} }object SessionFactory {//該部分相當于java中靜態塊var counts = 5val sessions = new ArrayBuffer[Session]()while(counts > 0) {sessions += new Sessioncounts -= 1}//在object中的方法相當于java中的靜態方法def getSession() : Session = {sessions.remove(0)} }class Session {}

在如:

package cn.toto.scala.day2/*** Created by toto on 2017/6/29.*/ class SingletonDemo2 {println("abc")SingletonDemo2.sayHi()SingletonDemo2test()def test() : Unit = {println("test")} }object SingletonDemo2 {private val t = 123def sayHi() : Unit = {println("hi ~")}/*** 運行的結果是:* hi ~* 123* 123* abc* hi ~* test* hi ~* ()* cn.toto.scala.day2.SingletonDemo2$@5e025e70* cn.toto.scala.day2.SingletonDemo2$@5e025e70* cn.toto.scala.day2.SingletonDemo2$@5e025e70*/def main(args: Array[String]): Unit = {sayHi()println("123")println(t)val s = new SingletonDemo2val s1 = SingletonDemo2.sayHi()println(s1)val s2 = SingletonDemo2val s3 = SingletonDemo2println(s3)println(s3)val s4 = SingletonDemo2println(s4)} }

1.4. 伴生對象

在Scala的類中,與類名相同的對象叫做伴生對象,類和伴生對象之間可以相互訪問私有的方法和屬性

package cn.toto.scala.day2/*** Created by toto on 2017/6/29.*/ class Dog {val id = 1private var name = "toto"def printName() : Unit = {//在Dog類中可以訪問伴生對象Dog的私有屬性println(Dog.CONSTANT + name)} }object Dog {//伴生對象中的私有屬性private val CONSTANT = "汪汪汪 : "/*** 運行結果是:* 汪汪汪 : toto* 汪汪汪 : 123* @param args*/def main(args:Array[String]): Unit = {val p = new Dog//訪問私有字段namep.printName()p.name = "123"p.printName()} }

1.5. apply方法

通常我們會在類的伴生對象中定義apply方法,當遇到類名(參數1,…參數n)時apply方法會被調用

package cn.toto.scala.day2/*** Created by toto on 2017/6/30.*/ object ApplyDemo {def main(args: Array[String]): Unit = {//調用了Array半生對象的apply方法//def apply(x:Int,xs:Int*):Array[Int]//arr1中只有一個元素5var arr1 = Array(5)println(arr1.toBuffer)//new了一個長度為5的array,數組里面包含5個nullvar arr2 = new Array(5)} }

在如:

package cn.toto.scala.day2/*** Created by toto on 2017/6/30.*/ object ApplyDemo {def apply() : Unit = {println("apply invoked")}def apply(name:String):String = {name}def apply(name:Int) : Int = {println("Int")name}/*** 從下面的案例中可以知道,若沒有使用new關鍵字創建實例,它將使用相應的apply方法來創建實例* @param args*/def main(args: Array[String]): Unit = {// //運行結果是:apply invoked// val a1 = ApplyDemo()結果直接是tom//val a2 = ApplyDemo("tom")//結果是:Intval a3 = ApplyDemo(10)//打印的結果是:10println(a3)} }

1.6. 應用程序對象

Scala程序都必須從一個對象的main方法開始,可以通過擴展App特質,不寫main方法。

package cn.toto.scala.day2/*** Created by toto on 2017/6/30.* //運行結果是:I love you Scala*/ object AppObjectDemo extends App{//不用寫main方法println("I love you Scala") }

總結

以上是生活随笔為你收集整理的Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。