4_scala_类相关
2016-04-01 15:54
387 查看
//primary constructor class Person(var firstName: String, var lastName: String) { println("the constructor begins") //some class field private val HOME = System.getProperty("user.home") var age = 0 //some method override def toString = s"$firstName $lastName is $age years old" def printHome { println(s"HOME=$HOME") } def printFullName { println(this) } printHome printFullName println("still in the constructor") } val p = new Person("Eric", "Chan") p.firstName = "vince" p.printFullName p.lastName_$eq("Dan") p.printFullName println() //visibility of construct fields //If a field is declared as a var, Scala generates both getter and setter methods for that field //If the field is a val, Scala generates only a getter method for it //If a field doesn't have a varor valmodifier, Scala gets conservative, and doesn't // generate a getter or setter method for the field. Expect "case class" //var and val fields can be modified with the privatekeyword, which // prevents getters and setters from being generated class Person1(private var name: String = "whoami") { def getName = name } val p1 = new Person1 //println(p1.name) println(p1.getName) //Case classes //Case class constructor parameters are val by default //An apply method is generated, so you don’t need to use the newkeyword to create // a new instance of the class //Accessor methods are generated for the constructor parameters because case class // constructor parameters are val by default. Mutator methods are also generated for // parameters declared as var //A good, default toString method is generated //An unapply method is generated, making it easy to use case classes in match expressions //equals and hashCode methods are generated //A copymethod is generated //not constructor, but companion object apply method case class Person2(name: String, age: Int) object Person2 { def apply() = new Person2("<no name>", 0) def apply(name: String) = new Person2(name, 0) } println(Person2()) println(Person2("Pam")) val p2 = Person2("whoami", 82) println(p2) println() //auxiliary constructor class Pizza(var size: Int, var pType: String) { def this(size: Int) { this(size, Pizza.DEFAULT_TYPE) } def this(pType: String) { this(Pizza.DEFAULT_SIZE) this.pType = pType } def this() { this(Pizza.DEFAULT_SIZE, Pizza.DEFAULT_TYPE) } override def toString = s"A $size pizza with a $pType crust" } object Pizza { val DEFAULT_SIZE = 12 val DEFAULT_TYPE = "thin" } println(new Pizza(Pizza.DEFAULT_SIZE, Pizza.DEFAULT_TYPE)) println(new Pizza(Pizza.DEFAULT_SIZE)) println(new Pizza(Pizza.DEFAULT_TYPE)) println(new Pizza) println() //private constructor class Order private (id: String) { override def toString = s"Order id: $id" } object Order { private val order = new Order("0000") def getInstance = order } //val order = new Order("111") println(Order.getInstance) //println(Order.order) println() //default value for constructor parameter class Socket(timeout: Int = 3000, linger: Int = 200) { override def toString = s"timeout: $timeout, linger: $linger" } println(new Socket()) println(new Socket(10000)) println(new Socket(linger=500)) println() //preventing getter and setter generated class Stock { private var price: Double = _ private[this] var newPrice: Double = _ def setPrice(p: Double) { price = p } def setNewPrice(p: Double) { newPrice = p } def isHigher(that: Stock): Boolean = this.price > that.price //error: this method won't compile because newPrice is now object-private //def isNewHigher(that: Stock): Boolean = this.newPrice > that.newPrice } val s1 = new Stock s1.setPrice(20) val s2 = new Stock s2.setPrice(100) println(s2.isHigher(s1)) //assign field to a block or function class Foo { //the text field isn't initialized until it’s accessed lazy val text = { try { io.Source.fromFile("/etc/passwd").getLines.filter(_.contains("root")).foreach(println) } catch { case e: Exception => println("Error happened") } } } val foo = new Foo foo.text println() //uninitialized var field type case class Login(var userName: String, var password: String) { var age = 0 var firstName = "" var lastName = "" var addr:Option[Address] = None } case class Address(city: String, state: String, zip: String) val l = new Login("whoami","123456") if (l.addr == None) println("No address") l.addr = Some(Address("BJ", "HB", "010000")) l.addr.foreach { a => println(a.city) println(a.state) println(a.zip) } println() //extending class constructor parameters class Employee(firstName: String, lastName: String, var addr: Address) extends Person(firstName, lastName) { override def toString = if (addr == null) lastName else s"$firstName @ $addr" } val employee = new Employee("Eric", "Chan", Address("BJ", "HB", "010000")) println(employee) println() //when to use an abstract class //You want to create a base class that requires constructor arguments //The code will be called from Java code abstract class Controller(c: String) { def update = c.toUpperCase def connect def getStatus: String def setServerName(serverName: String) } //need abstract keyword or define superclass's abstract methods //class MyController(c: String) extends Controller(c) //define properties in an abstract class (or trait) //An abstract varfield results in getter and setter methods being generated for the field //An abstract valfield results in a getter method being generated for the field //When you define an abstract field in an abstract class or trait, the Scala compiler // does not create a field in the resulting code; it only generates the methods that // correspond to the val or var field abstract class Pet(name: String) { val greeting: String var age: Int def sayHello { println(greeting) } override def toString = s"I say $greeting, and I'm $age" } class Dog(name: String) extends Pet(name) { val greeting = "Woof" var age = 5 } class Cat(name: String) extends Pet(name) { val greeting = "Meow" var age = 2 } val dog = new Dog("Fido") val cat = new Cat("Morris") dog.sayHello cat.sayHello println(dog) println(cat) cat.age = 3 println(cat) println() //Object equality class Person3(name: String, age: Int) { def canEqual(a: Any) = a.isInstanceOf[Person3] override def equals(that: Any):Boolean = { that match { case that: Person3 => that.canEqual(this) && that.hashCode == this.hashCode case _ => false } } override def hashCode: Int = { val prime = 31 var result = 1 result = prime * result + age result = prime * result + (if (name == null) 0 else name.hashCode) return result } override def toString = s"I am $name, and I'm $age" } // these first two instances should be equal val nimoy = new Person3("Leonard Nimoy", 82) val nimoy2 = new Person3("Leonard Nimoy", 82) val shatner = new Person3("William Shatner", 82) val ed = new Person3("Ed Chigliak", 20) println(nimoy) println(nimoy2) println(shatner) println(ed) // all tests pass println("nimoy == nimoy is " + (nimoy == nimoy)) println("nimoy == nimoy2 is " + (nimoy == nimoy2)) println("nimoy2 == nimoy is " + (nimoy2 == nimoy)) println("nimoy != shatner is " + (nimoy != shatner)) println("shatner != nimoy is " + (shatner != nimoy)) println("nimoy != null is " + (nimoy != null)) println("nimoy != String is " + (nimoy != "Leonard Nimoy")) println("nimoy != ed is " + (nimoy != ed))
相关文章推荐
- ShellExecuteEx启动WORD进程关不掉的处理
- Loadrunner参数化
- WCF之初体验
- iOS开发延迟执行一个方法的方法
- 8139too.c网卡驱动简单分析
- CA接口测试类
- 机器学习与R语言:C5.0
- Simple way to implement caching in ASP.NET Web API
- FastDFS 5.08 部署与配置(包括老版本卸载)
- Xcode一种涉及到多桌面的调试技巧
- 数据库(九)windows下mysql忘记root账户密码
- 怎样用iMindMap来筹划项目
- 查询省市区,转成 json 表
- Xcode一种涉及到多桌面的调试技巧
- Xcode一种涉及到多桌面的调试技巧
- 计算机视觉、机器学习相关领域论文和源代码大集合
- iOS Xib尺寸适配屏幕尺寸
- 网页错误页提示码汇总及使用示例
- 15、C++基本概念----构造函数和析构函数
- unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死