Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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.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方法调用,应用程序对象的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 口香糖为什么能开椰子?
- 下一篇: Melrose椰子油是如何生产的?
