Scala 类和对象的定义声明

2019-04-29 22:19:09 | 编辑 | 添加


1.1scala class类

class类和java普通类差不多,是需要new的

class Teacher {  
  var age: Int = _  //这里的下划线和0是一个意思
  
  //重载的构造器和java里面的public Teacher(){}类似  
  def this(age: Int, name: String){  
    this() //必须得调用一次主构造器  
    this.age=age   
  }  
}


1.2Scala Object类(单例对象)

在Scala中没有像Java一样的static语法,但是Scala中的Object类似于Java的static,它是一个单利,里边放静态的field和method。第一次调用object的时候就会执行object的constructor方法,也就是不在method代码中的代码,注意,只有第一次调用object的时候,才会执行constructor方法。并且object的constructor没有参数构造方法,只有无参构造方法。

object ObjectTest{
  private var name:String="l4"
  println("我是方法以为的代码。。。。。。。。。。。。。。。。。")
  def objectMethod(): Unit ={
    println("是否执行method方法???????????????")
  }
  def getName:String=name
}


1.3伴生对象与伴生类

如果有一个class和一个跟class同名的object,那么我们就可以管class叫做object的伴生类,管object叫class的伴生对象。伴生类与伴生对象一定要在同一个.scala文件中。伴生类和伴生对象最大的特点就是可以互相访问彼此的私有属性。这种功能是满足类似于Java里的类既有静态变量又有普通变量

object ObjectTest {
  private var name: String = "l4"
  private var name1: String = "z4"
  def helloPrivate: Unit = {
    //调用伴生类的私有属性,,如果不是伴生类,那么是访问不到私有属性的,打印结果为 10
    val objectTest = new ObjectTest
    println(objectTest.age)
  }
}
class ObjectTest {
  private var age: Int = 10
  def helloPrivate: Unit = {
    //调用伴生对象的私有属性,如果不是伴生对象,那么是访问不到私有属性的,打印结果z4
    println(ObjectTest.name1) 
  }
}

1.4Scala内部类

//外部类
class OutClass {
  val array = new ArrayBuffer[Inner]()
  //内部类,它从属于外部类的具体事例,跟java有本质上的区别
  class Inner {}
  def getInner: Inner = {
    new Inner
  }
}


1.5scala case class

case类就是自动模式匹配类,他会在编译时自动为你生成匹配的参数方法及构造函数等成员

case class CaseClass(a:Int, b:Int)  
object Demo{  
    def main(args:Array[String]){  
        var c =  CaseClass(10,10)       // Creating object of case class  
        println("a = "+c.a)               // Accessing elements of case class  
        println("b = "+c.b)  
    }  
}

当一个类被定为case class 时,scala会默认做如下工作:

(1)如果参数不加var/val修改,默认为val。

(2)自动创建伴生对象并实现apply方法,这样创建对象时不用写new,因为只要写上类名就会自动调用它的构造方法

(3)默认实现toString、hashCode、copy和equals方法

(4)默认是可以序列化的

(5)自动从scala.Product中继承一些函数;

(6)case class构造函数的参数是public级别的,我们可以直接访问;

(7)做模式匹配用