//不用修飾符 class HelloWorld{ //定義一個私有的field private var name = "CZM" def fun(){ //這是一個帶參數的方法 } def getName = name //定義一個不帶參數的方法
val helloWorld = new HelloWorld //括號無關緊要
//能夠不寫*()* helloWorld.fun() //不能寫*()* helloWorld.getName
//自動生成的getter和setter方法,經過 val var private private[this] var name = "CZM" /*自動生成以下代碼 //getter def name = name //setter def name_ = (new_name:String) */ //手動getter和setter private var name= "CZM" def name = "Your name is "+name //錯誤,由於這樣至關於兩次定義了name class HelloWorld { private var old_name= "CZM" def name = "Your name is "+old_name //正確:old_name 做爲類中的私有feild,僅僅提供私有的getter和setter方法,而name做爲一個提供了public的getter和setter方法的feild ==> var name並重寫了public的getter和setter def name_=(new_name: String) { //須要注意的是這裏的語法規則,**=號先後不容許有空格** old_name = new_name print("Your new name is " + old_name) } } //調用getter和setter var helloWorld = new HelloWorld() helloWorld.name //geter helloWorld.name_= "asd" //正兒八經setter helloWorld.name = "asd" //新型setter,將name做爲返回,買一送一
class Student{ private var myAge = 0 //private[this] var myAge = 0 //調用getter方法會報錯,即便定義了getter和setter方法 def age = myAge def age_=(newValue:Int){ if (newValue<0){println("illegal gar!!")} else{myAge = newValue} } def older(s:Student){ myAge > s.myAge } }
@BeanProperty var age = 0 @BeanProperty var age:Int = _ //使用佔位符須要聲明類型 //同時擁有兩種調用方式 s1.getAge s1.age
//固然,能夠設置默認參數 class Student(name:String,age:Int){}
class Student(){ private var name = "" private var age = 0 def this(name:String){ this() //若是不相互調用,必須調用**主構造函數**,且要在**首行 == JAVA** this.name = name } def this(name:String,age:Int){ this(name) this.age = age } }
與JAVA不一樣的是,Scala中的外部類的對象的內部類都是不一樣的類java
import scala.collection.mutable.ArrayBuffer class Class { class Student(name: String) {} val students = new ArrayBuffer[Student]() def getStudent(name: String) = { new Student(name) } } val c1 = new Class val c2 = new Class val s1 = c1.getStudent("CZM") //s1: c1.Student = Class$Student@1d3f8af1 val s2 = c2.getStudent("czm") //s2: c2.Student = Class$Student@73589106 c1.students += s1 //正確 c1.students += s2 //錯誤,每個內部類都是屬於對象的,而不是獨立存在的 /*錯誤信息 Error:(21, 24) type mismatch; found : c2.Student required: c1.Student c1.students += s2 */
因爲類中定義的feild都是屬於對象的,並無屬於類的字段,在JAVA中使用Static定義的字段做爲全部對象共用的類的字段,在scala中提供了object來存放。spring
//定義object對象 object Person { //不能有括號,不能定義帶參數的constructor private var name = "" println("This is constructor!") def getName = name println("This is constructor too!") } Person.getName //讓object繼承抽象類 abstract class Hello { def syaHello(name: String): Unit } object HelloObject extends Hello { override def syaHello(name: String): Unit = { println("Implement from Hello, your name is " + name) } } HelloObject.syaHello("CZM")
class Person(name: String, age: Int) { def sayHello = { println("Hello " + name + " you are " + age + " years old, and you must have " + Person.legNum + "legs") //須要加上Object名訪問object對象變量(即便不是私有的) } } object Person { private var legNum = 2 def getLegNum = legNum } val p1 = new Person("czm", 18) p1.sayHello
class Person(name: String) object Person { def apply(name: String): Person = new Person(name) } Person("你好")
//注意文件名與類名相同 object HelloWorld { def main(args: Array[String]) { if (args.length != 0) { println("Hello " + args(0)) } else { println("Hello World!") } } }
繼承APP Trait,而後將須要在main中運行的代碼,直接在constructor中編寫。直接使用args接收傳入的參數黑人問號臉??:這裏的參數是來自父類APP Trait的父類DelayedInit Trait的Main方法中的args數組
object HelloWorld extends App{ if (args.length != 0) { println("Hello " + args(0)) } else { println("Hello World!") } }
object Season extends Enumeration{ val SPRING,SUMMER,AUTUMN,WINTER = Value //Value方法繼承於Enumeration //能夠自定義Value的元素 val SPRING = Value(0,"spring") ... } //調用 //Enumeration的apply方法返回一個Value對象 Season(0) res0: Season.Value = SPRING Season("spring")
enum Weeday{ SUNDAY,MONDAY.TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY; } //在底層 //建立了一個final的Weeday類繼承Enum //實例化各個字段爲 public final static 的 Weekday 對象,存在數組$VALUES中 //定義了一個values方法,用於返回數組 //Weekday.values() //定義了一個valueOf方法,用於返回 //Weekday.valueof("SUNDAY")