1.trait
trait相当于java中的接口,但用法截然不同
trait中可以定义属性和方法,但是在实现类中需要给属性赋值,方法可以直接调用
trait不可以传参
package zjc
trait read{
var age:Int
def read(name:String){
println(name + "is reading")
}
}
trait listen{
var sex:Int
def listen(name:String){
println(name+"is listening")
}
}
class person2() extends read with listen {
override var age: Int = 19
override var sex: Int = 1
}
object test06 {
def main(args: Array[String]): Unit = {
val person1= new person2
println(person1.listen("zjc"))
println(person1.read("lff"))
println(person1.age)
println(person1.sex)
}
}
2.trait中有方法没实现
如果trait中有方法没实现,则实现类继承时要将其实现
package zjc
trait wirte{
def write(name:String)
}
class person3 extends wirte {
override def write(name: String): Unit ={
println(s"$name is writring")
}
}
object test07 {
def main(args: Array[String]): Unit = {
val person1: person3 = new person3
println(person1.write("zjc"))
}
}
3.模式匹配 case class
模式匹配可以匹配值也可以匹配类型
package zjc
object test08 {
def main(args: Array[String]): Unit = {
val tuple=Tuple4(1,2,3,"String")
val iterator: Iterator[Any] = tuple.productIterator
while(iterator.hasNext){
MatchTest(iterator.next())
}
}
def MatchTest(x:Any){
x match{
case x:Int=>println("type is Int")
case 1=>println("result is 1")
case x:String=>println("type is String")
}
}
}
4.偏函数
函数中只有case,就可以定义成偏函数PartialFunction,定义时不能使用括号传参
object test09 {
def main(args: Array[String]): Unit = {
println(MyTest("hello"))
}
def MyTest:PartialFunction[String ,Int]={ //表示偏函数,只能进来String ,出case
case "scala"=>1
case "hello"=>2
}
}
5.样例类
(1)使用关键字case定义的类就是样例类,当参数是var时,会自动实现setter和getter方法
(2)默认实现了toString,equals等方法
object test10 {
def main(args: Array[String]): Unit = {
var p1=new people("zjc",18)
var p2=new people("zjc",18)
println(p1.equals(p2)) //样例类比较的是数值,否则比较地址
println(p1.toString) //如果不是样例类就是地址
}
}
case class people(var name:String,var age:Int)