构造器的使用
调用apply方法时.apply可以省略
object Hello{ def main(args:Array[String]){ //println("hello world") val m1 = new Man("Zhangsan") // 会报错 // m.apply("zhu") val list = List("aa", "bb") //调用的是伴生对象中的apply val m2 = Man("Wangwu") println("000000000000000000000"); //调用的是class中的apply m2("liu", 33) }}//如果没有显示定义构造方法,编译器会分配一个默认的(不带参数)主构造器//主构造器跟在类名后面class Man(var name:String){ //被主构造器调用 //println(name) var id:Int = 0 var age:Int = 0 //辅助构造器,第一行代码必须是对主构造器或者另外一个辅助构造器的调用 def this(name:String, id:Int){ this(name) this.id = id } def this(name:String, id:Int, age:Int){ this(name,id) //this.id = id this.age = age } // def apply(name:String,id:Int): Unit = {// println("Unit")// } //也可以返回list// def apply( name: String,id:Int): List[String] = List("ds","werfew") def apply(name:String,id:Int):Man= new Man(name,id)}object Man{ def apply(name:String): Man = { new Man(name,id)// println("object Man")// def apply(name:String):Man = new Man(name)}
apply方法的使用
object apply { def main(args: Array[String]): Unit = { val anyObject = new SomeClass println(anyObject("key1")) val ss = SomeClass("aa") println(ss) val email = EMail("fantasia", "sina.com") println(email) val email2 = new Email email2("Test") }}class SomeClass { println("SomeClass ........"); def apply(key: String): String = { println("SomeClass apply()" + key) key }}object SomeClass{ def apply(a:String){ println("SomClass object apply()" + a) }}class Email{ def apply(x:String){ println("Email apply"); println(x); }}object EMail { def apply(user: String, domain: String): String = { println("Email Object apply()") user + "@" + domain }}
unapply的使用
object Apply_unapply { def main(args: Array[String]): Unit = { val currency = Currency(30.2, "EUR") currency match { case Currency(amount, "USD") => println("$" + amount) case _ => println("No match.") } }}class Currency(val value: Double, val unit: String) {}object Currency{ def apply(value: Double, unit: String): Currency = new Currency(value, unit) def unapply(currency: Currency): Option[(Double, String)] = { if (currency == null){ None } else{ Some(currency.value, currency.unit) } }}