Scala基础知识笔记2
生活随笔
收集整理的這篇文章主要介紹了
Scala基础知识笔记2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
?
1 類
1.1 定義一個簡單的類
1.2 field的getter 和 setter方法
感覺成員變量定義成? var 屬性名=屬性值即可,? 不需要定義成 val 或者 private就行,
// ---------------------- 自定義類 和 屬性 get set方法-------------------------------------------------/* class HelloWorld {var name="zm" // 自動生成get set方法, 如果屬性是private 那么生成的get set方法也是privateval age = 32 // val類型的成員變量只提供get方法 不提供set方法 比如調用 對象.age=34會報錯def sayHello(name:String) {println("hi: " + name)}def getName = name}val hello = new HelloWorld//println(hello.getName) // 如果定義的方法沒有括號 那么調用時也不能帶括號//println(hello.sayHello("ping"))//println(hello.name) get方法獲取屬性值//hello.name="ping" set方法設置屬性值// println(hello.name)println(hello.age)// hello.age=34 // 編譯報錯//hello.love */// 自定義 屬性的 get set方法 Scala的getter和setter方法的命名與java是不同的,是field和field_=的方式/*class Man{private var myname = "zm"def name = "you name is" + myname // get方法def name_=(value:String) { // 自定義 private類型的屬性的 set方法 其中 _=固定寫法并且前后不能有空格print("you cannot edit your name!!!")}}/* val man = new Manprintln(man.name) // 調用屬性 get方法man.name="liang" // 調用屬性 set方法 */// 屬性是private類型的成員變量 自定義 set方法來修改屬性值class Man{private var myname = "zm"def name = "you name is" + myname // get方法def updateName(value:String) { // 自定義 private類型的屬性的set方法myname = value}}val man = new Manprintln(man.name)man.updateName("liang")println(man.name)*/// 生成java風格的 get set方法 感覺沒必要/*import scala.reflect.BeanPropertyclass Student{@BeanProperty var name:String =_class Student(@BeanProperty var name: String)}val s = new Students.setName("leo")println(s.getName())*/?
1.3 constructor介紹
1.4 內部類介紹
// 輔助構造函數 類似 java的構造器 /* class Person{var name = ""var age = 0def this(name:String) {this()this.name = name}def this(name:String, age:Int) {this(name:String)this.age = age}}var person = new Person("zm",34)println(person.name)println(person.age)*/// 主構造函數 就是在類名括號里定義 構造函數需要的形參的寫法 /* class Person(val name: String, val age: Int) {println(name + " | " + age)}var person = new Person("zm",32)*/// 內部類 import scala.collection.mutable.ArrayBufferclass Class {class Student(val name: String) {}val students = new ArrayBuffer[Student]def getStudent(name: String) = { // 理解為新生報到new Student(name)}}val c1 = new Classval s1 = c1.getStudent("leo")c1.students += s1?
1.5 object 靜態類-繼承-枚舉-object的apply方法
// object 相當于靜態類 存放靜態field 和 method 工具方法 不能定義接受參數的constructor// object內部不在method內的代碼就是 object的constructor object的constructor只會在其第一次調用時執行一次 /* object Person{private var eyes = 2println("this is object Person consutror")def getEyes = eyes}println(Person.getEyes)*/// 伴生類和伴生對象 class類和class同名的object對象并定義在同一個 .scala文件中,那么彼此是對方的伴生類好伴生對象// 特點是互相可以訪問對方的private field屬性/* object Person {private val eyeNum = 2def getEyeNum = eyeNum}class Person(name:String="zm", age:Int=32) {def sayHello = println(name + " | " + age + " have " + Person.getEyeNum + " eyes") // 使用伴生類的私有屬性}val person = new Personperson.sayHello*/// objectjic 繼承 抽象類 /* abstract class Hello(var name:String="zm", var age:Int=32) {def sayHello(name:String):Unit}object Person extends Hello("zm",34) {override def sayHello(name: String) {println("hello " + name )}}Person.sayHello("liang")*/// object的重要方法 apply// 通常在伴生對象中實現apply方法,并實現構造伴生類的對象的功能,而且創建時通常不使用new Class的方式,使用Class()的方式// 隱士調用伴生對象的apply方法, 讓代碼更簡潔 eg: val a = Array(1,2,3) Array類的伴生對象的apply方法就實現了接收可變數量的參數,并創建一個Array對象的功能// 自定義 伴生類和伴生對象和 apply /* class Person(var name:String){}object Person {def apply(name:String): Unit = {new Person(name)}}*/// 必須定義在 object的main函數寫法 /* object HelloWorld {def main (args: Array[String]){println("hello world")}}*/// scalac xx.scala scala xxx 編譯和運行// 使用object實現枚舉// Scala沒有直接提供類似于Java中的Enum這樣的枚舉特性,需要用object繼承Enumeration類,并且調用Value方法來初始化枚舉值 /* object Season extends Enumeration {val SPRING = Value(0, "spring") // 索引位置 索引值val SUMMER = Value(1, "summer")val AUTUMN = Value(2, "autumn")val WINTER = Value(3, "winter")}println(Season(0)) // 得到 spring這個value的值println(Season.withName("spring")) // 得到 spring//for (ele <- Season.values) println(ele)for(c<-Season.values) println(c)*/?
繼承之? override? super? isInstanceof? asInstanceof? 模式匹配判斷對象類型?
// 繼承中 子類覆蓋父類方法 必須使用 override 子類調用父類被覆蓋的方法使用 super 關鍵字/* class Person {private var name = "leo"val age = 32def getName = name}class Student extends Person {private var score = "A"override val age = 34 // 子類可以覆蓋父類 val的變量def getScore = scoreoverride def getName = "Hi, I'm " + super.getName}*/// 父類對象 指向了子類實例, 然后父類對象又想轉換為子類 如果對象是null,則isInstanceOf一定返回false,asInstanceOf一定返回null/* cvar p:Person = new Studentif(p.isInstanceOf[Student]) { // 如果是子類類型//println("p is student")var s:Student = p.asInstanceOf[Student] // 那么強轉成子類類型println( p.getClass ) // class com.beijing.App$Student 得到類實例的真實類信息println( classOf[Person] ) // class com.beijing.App$Person*/// 使用模式匹配 判斷對象類型 /* class Personclass Student extends Personval p:Person = new Studentp match {case one:Person => println("i am the Person type")case _ => println("i am unknown type")}*/?
繼承之子類父類構造函數
// 子類調用父類的constructor 1 每個類可以有一個主constructor 和任意多個輔助constructor, 而每個輔助constructor第一行// 都必須是調用主constructor或者其他輔助constructor, 也就是子類的輔助構造函數第一行是一定不可能調用主類的構造函數的// 2 只能在子類的主構造函數中調用父類的構造函數, 如果是父類中接收的參數,比如name和age,子類中接收時,就不要用任何val或var來修飾了,否則會認為是子類要覆蓋父類的field /* class Person(name:String, age:Int)class Student(name:String, age:Int, var sex:Int) extends Person(name, age) {def this(name:String) {// 輔助構造函數調用主構造函數this(name,0,0)}def this(age:Int,name:String) {// 第一行 調用其他輔助構造函數this(name)}}*/?
繼承之 匿名內部類 抽象類?
// 匿名內部類 定義沒有名稱的子類并直接創建對象,將創建的對象賦予一個變量, 以及可以將該對象傳遞給其他函數 /* class Person(val name:String) { // 定義原始類def sayHello = "hello, i am " + name}val p = new Person("zm") { // 匿名內部類需要覆蓋主類的方法 因為匿名內部類相當于主類的子類override def sayHello = "hello, i am" + name}def greeting(p:Person) { // 普通傳參println(p.sayHello)}def greeting1(p:Person{def sayHello:String}) { // 普通傳參println(p.sayHello)}greeting1(p)*/// 抽象類 抽象方法 抽象屬性 子類在繼承過來之后 這些類方法屬性都不需要override?
轉載于:https://www.cnblogs.com/chengjianxiaoxue/p/10181786.html
總結
以上是生活随笔為你收集整理的Scala基础知识笔记2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目前最全的存储形式总结
- 下一篇: 北京阿里云ACE态势感知大屏体验黑客攻击