1、类 、抽象类、伴生对象、继承
// scala中不存在public关键字,源文件中可以包含多个类,这些类都具有公有可见性 // 定义一个抽象类 abstract class Animal { val age:Int = 0 val weight:Int = 0 // 抽象类中的函数能有默认实现 def cry(): Unit = println("This a Animal.") } // 定义一个类型,继承抽象类Animal,在Scala中和Java一样都是使用extends关键字进行继承。 class Cat extends Animal { // 重写父类方法。 // 能访问伴生对象中的私有成员变量 override def cry(): Unit = println(s"This a cat.${Cat.voice}") } // Cat的伴生对象,object定义的类,成为伴生对象,也是单例对象。 object Cat { private val voice = "喵喵喵" def apply(): Cat = { println("Cat apply.") new Cat() } // 重载apply() def apply(info:String): Cat = { println(info) new Cat() } def main(args: Array[String]): Unit = { // 这里相当于调用Cat伴生对象中apply()方法。伴生对象中的apply()方法,类似c++中重载()操作符 val cat = Cat().cry() val cat2 = Cat("调用重载的构造方法").cry() } }
2、类的构造方法
/** *每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起 */ class Person (val name:String, val age:Int){ // 这里使用val 休息的成员变量,表示是私有属性的 var gender: Char = 'M' println("主构造器") def this(name:String, age:Int, gender: Char) { this(name,age) // 辅助构造器中,需要先调用主构造器 this.gender = gender println("辅助构造器") } def print(): Unit = { println(s"name is ${name}; age is ${age}; gender is :${gender}") } } // 超类的构造语法 class Student(name:String, age:Int) extends Person(name, age) { override def print(): Unit ={ System.out.print("I'm a student.") super.print() } } object Person { def main(args: Array[String]): Unit = { val p1 = new Person("xiao ming", 18) p1.print() val p2 = new Person("xiao hong", 12 , 'F') p2.print() val p3 = new Student("xiao nie", 11) p3.print() } }
【来自@若泽大数据】