classApplyTest{def apply() = println("I am into Spark so much!!!")
def haveATry{
println("Have a try on apply!")
}
}
objectApplyTest{def apply() = {
println("I am into Scala so much!!!")
new ApplyTest
}
}
objectApplyOperation {def main(args: Array[String]) {
val array = Array(1,2,3,4,5)
val a = ApplyTest()
a.haveATry
// val a = new ApplyTest// a.haveATry
println(a())
//I am into Scala so much!!!//Have a try on apply!//I am into Spark so much!!!//()
}
}
继承
classOverrideOperationsclassPerson1(val name : String, var age : Int){
println("The primary constructor of Person")
val school = "BJU"def sleep = "8 hours"overridedef toString = "I am a Person1!"
}
// 子类继承父类在构造器上的构造classWorker(name : String, age : Int, val salary : Long)extendsPerson1(name, age){
println("This is the subClass of Person, Primary constructor of Worker")
overrideval school = "Spark"//重写字段overridedef toString = "I am a Worker!" + super.sleep
}
objectOverrideOperations{def main(args: Array[String]) {
val w = new Worker("Spark", 5, 100000) //会打印子类和父类的构造器 println
println("School :" + w.school)
println("Salary :" + w.salary)
println(w.toString())
//The primary constructor of Person//This is the subClass of Person, Primary constructor of Worker//School :Spark//Salary :100000//I am a Worker!8 hours
}
}
抽象类
classAbstractClassOps{// 相比而言,非抽象类字段必须赋值var id : Int = _
}
abstractclassSuperTeacher(val name : String){// 声明时不给字段赋值var id : Int
var age : Int
// 抽象类中的方法不写方法实现体def teach
}
classTeacherForMaths(name : String)extendsSuperTeacher(name){// 虽然可以不写,但还是建议养成复写的习惯overridevar id = name.hashCode()
overridevar age = 29// 实现方法overridedef teach{
println("Teaching!!!")
}
}
objectAbstractClassOps{def main(args: Array[String]) {
val teacher = new TeacherForMaths("Spark")
teacher.teach //Teaching!!!
println("teacher.id" + ":" + teacher.id) //teacher.id:80085693
println(teacher.name + ":" + teacher.age) //Spark:29
}
}
trait
classUseTrait {
}
// 作为接口traitLogger{// 方法可以实现也可以不实现// def log (msg : String)def log (msg : String){}
}
classConcreteLoggerextendsLoggerwithCloneable{// override def log(msg : String) = println("Log: " + msg)def concreteLog{
log("It's me !!!")
}
}
traitTraitLoggerextendsLogger{overridedef log (msg : String){
println(" TraitLogger Log content is : " + msg)
}
}
traitTraitLoggered{def loged (msg : String){
println("TraitLoggered Log content is : " + msg)
}
}
traitConsoleLoggerextendsTraitLogger{overridedef log(msg : String){
println("Log from Console :" +msg)
}
}
classTestextendsConsoleLogger{def test{
log("Here is Spark!!!")
}
}
abstractclassAccount{def save
}
classMyAccountextendsAccountwithConsoleLogger{def save{
log("11")
}
}
classHuman{
println("Human")
}
traitTTeacherextendsHuman {
println("TTeacher")
def teach
}
traitPianoPlayerextendsHuman {
println("PianoPlayer")
def playPiano = {println("I'm playing piano. ")}
}
//从左往右构造 已构造的Human不会重复构造classPianoTeacherextendsHumanwithTTeacherwithPianoPlayer {overridedef teach = {println("I'm training students. ")}
}
//AOPtraitAction {def doAction
}
traitTBeforeAfterextendsAction {abstractoverridedef doAction {
println("Initialization")
super.doAction
println("Destroyed")
}
}
classWorkextendsAction{overridedef doAction = println("Working...")
}
objectUseTraitextendsApp{val t1 = new PianoTeacher
t1.playPiano
t1.teach
val t2 = new Human with TTeacher with PianoPlayer {
//必须要重写 def teach = {println("I'm teaching students.")} }
t2.playPiano
t2 teach
val work = new Work with TBeforeAfter
work.doAction
// val logger = new ConcreteLogger with TraitLogger//// val logger = new ConcreteLogger// logger.concreteLog// val logger = new Test// logger.test;// // val account = new MyAccount with TraitLoggered// account.save//Human//TTeacher//PianoPlayer//I'm playing piano. //I'm training students. //Human//TTeacher//PianoPlayer//I'm playing piano. //I'm teaching students.//Initialization//Working...//Destroyed
}