琐碎注意事项,仅针对3.0以下"/>
scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下
构造函数
- 主构造函数如果不加val 和var ,只是构造传参而已,不属于类变量
class Demo(name: String)➜ sbt_demo javap -p Demo
Compiled from "Demo.scala"
public class Demo {public Demo(java.lang.String);
}
- 加了var 和val类型的主构造变量会升级为私有变量。同时生成一个公开的访问方法。而且val 的变量是final,var不是。
class Demo(name: String, var age: Int, val home: String)➜ sbt_demo javap -p Demo*
Compiled from "Demo.scala"
public class Demo {private int age;public int age();public void age_$eq(int);private final java.lang.String home;public java.lang.String home();public Demo(java.lang.String, int, java.lang.String);
}
- 成员变量写在主构造方法里和类里面在可见性和可变性上没有区别,唯一的区别在于构造函数
class Demo(name: String) {var age: Int = 0val home: String = "ok"
}➜ sbt_demo javap -p Demo*
Compiled from "Demo.scala"
public class Demo {private int age;public int age();public void age_$eq(int);private final java.lang.String home;public java.lang.String home();public Demo(java.lang.String);
}
trait
- trait不能有构造函数
trait people(name:String) // error
trait people(val name:String) // error
trait people(var name:String) // error
trait people{name:String} // error
trait people{val name:String} // right
trait people{var name:String} // right
trait的继承
- 普通的类继承trait,主构造函数不能作为接口的实现.但是抽象类和样例类可以
- var 类型的变量可以被 val类型的变量覆盖。反之不行
trait people {val name: Stringvar age: Int
}case class son(name: String, age: Int) extends people // right
abstract class son(name: String, age: Int) extends people // right
class son(name: String, age: Int) extends people // error
class son(val name: String, var age: Int) extends people // right
class son(val name: String, val age: Int) extends people // right
class son(var name: String, val age: Int) extends people // error
abstract class
- 样例类,抽象类,普通类继承抽象类,抽象类的主构造函数可以被覆盖
abstract class people(home: String) {val name: Stringvar age: Int
}case class son(name: String, age: Int, home: String) extends people(home) // right
abstract class son(name: String, age: Int, home: String) extends people(home) // right
class son(val name: String, var age: Int, home: String) extends people(home) // right
- 只有样例类覆盖后,才能对外可见.其他的可见性,继承者和被继承着保持一致
abstract class people(var home: String) {val name: Stringvar age: Int
}case class son(name: String, age: Int, override var home: String) extends people(home) // right
abstract class son(name: String, age: Int, home: String) extends people(home) // right
class son(val name: String, var age: Int, home: String) extends people(home) // right
更多推荐
scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下
发布评论