Scala 学习之面向对象(3)
==>类
--->类的定义
classStudent{//定义属性privatevarstuName:String="Tom"privatevatstuAge:Int=18//定义方法defgetStuName():String=stuNamedefsetStuName(newName:String)={this.stuName=newName}}
--->伴生类和伴生对象 object相当于 Java中的 static
----object对象可以跟类名不一样,如果跟类名一样,这个对象就是该类的伴生对象,反之,这个类就是这个伴生对象的伴生类
--->set和get方法
---- Scala中,会自动给private定义的属性生成get和set方法,使用val可以使其只生成get方法,而不会生成set方法
----在定义变量时使用 this关键字,可以使其成为此类的私有属性,不会生成 get和 set方法,如:
//定义正常的属性,可自动生成get和set方法privatevaraaa:String="hello"//定义只可自动生成get方法的属性privatevalaaa:String="hello"//使用this关键字,使其定义的属性成为此类的私有属性,不允许外界访问private[this]varaaa:String="hello"
--->嵌套类(内部类)
----内部类中的参数可以当做类的参数传递
--->类的构造器
----主构造器和类的声明在一起,只能有一个主构造器
classStudent(valstuName:String,valstuAge:Int){}objectStudent{defmain(args:Array[String]):Unit={varstu=newStudent("Tom",20)println(stu.stuName+"\t"+stu.stuAge)}}
----辅助构造器 可以有多个辅助构造器,使用 this关键字
classStudent(valstuName:String,valstuAge:Int){//定义一个辅助构造器defthis(age:Int){//调用主构造器this("NoName",age)}}objectStudent{//varstu=newStudent(22)println(stu.stuName+"\t"+stu.stuAge)}//输出结果为NoName22
---> Object对象:相当于Java中的static关键字
----单例模式:一个类只有一个对象
//生成信用卡的卡号objectCreditCard{//定义变量:保存信用卡的卡号//该属性只属于该对象private[this]varcreditCardNumbe:Long=0//产生卡号defgenerateNewCCNumber():Long={creditCardNumbe+=1creditCardNumber}//测试程序defmain(args:Array[String]):Unit={//得到新的卡号println(CreditCard.generateNewCCNumber)println(CreditCard.generateNewCCNumber)println(CreditCard.generateNewCCNumber)println(CreditCard.generateNewCCNumber)}}
----应用程序对象:App -----可以省略main方法
objecttestAppextendsApp{//省略了main方法,可以直接将结果输出println("hello")}
--->类的apply方法
----作用:创建对象时,省略new关键字,需要定义在类的伴生对象中
classStudent(stuName:String){}objectStudent{//定义apply方法,必须定义在类的伴生对象中defapply(stuName:String)={//调用主构造器newStudent(stuName)}defmain(args:Array[String]):Unit={varstu=Student("Tom")}}
==>继承
--->简单继承
//测试objectDemoExtends{defmain(args:Array[String]):Unit={//创建一个Person对象valp1:Person=newPerson("Tom",20)println(p1.sayHello())//MynameisTom,ageis20//创建一个子类valp2:Person=newEmployee("Marry",32,1233)println(p2.sayHello())//子类中的sayHello//创建一个匿名子类valp3:Person=newPerson("Jerry",33){overridedefsayHello():String="匿名函数中的sayHello方法"}println(p3.sayHello())//匿名函数中的sayHello方法}}//父类classPerson(valname:String,valage:Int){defsayHello():String="Mynameis"+name+",ageis"+age}//子类如果需要子类的值覆盖父类的值,需要加上override参数classEmployee(overridevalname:String,overridevalage:Int,valsalary:Int)extendsPerson(name,age){overridedefsayHello():String="子类中的sayHello"}
--->继承抽象类和抽象字段
objectTestExtendsDemo{defmain(args:Array[String]):Unit={varapple:Fruit=newApple()varorange:Fruit=newOrange()println(apple.name())//结果为appleprintln(orange.name())//结果为orange}}abstractclassFruit{varid:Intdefname():String}classAppleextendsFruit{//实现抽象字段varid:Int=1//实现抽象方法defname():String={"apple"}}//可以通过构造方法对抽象字段进行处理classOrange()extendsFruit{defname:String={"orange"}}
--->特质trait:有点像接口,也有点像抽象类 支持多重继承,可以定义抽象方和字段,也可以定义完整的方法和字段
objectDemo1{defmain(args:Array[String]):Unit={varcom:Computer=newComputer(1)println(com.run())println(com.movedown())}}classComputer(varmonitorid:Int)extendsMonitorwithMousewithKeyboard{defrun():String={"running"}defmoveup():String={"moveup"}overridedefmovedown():String={"movedown"}overridedefpress():String={"press"}}traitMonitor{varmonitorid:Intdefrun():String}traitMouse{defmoveup():Stringdefmovedown():String}traitKeyboard{defpress():String}
==>包的定义和使用
--->包的定义:
//定义格式一packagecom.mytestclassDemo{}//定义格式二packagecom.mytest{classDemo{}}
--->包的使用(引入):
importcom.mytest.Demo//可以不写Demo的全路径importcom.mytest._//引入mytest包下所有的属性importcom.mytest.Demo._//引入Demo类中所有的属性
==>包对象
packageobjectMyPackageDemo{//常量vala:Int=1//变量vara:String="hello"//方法defDemo():String={"Demo"}//类classDemo{}//对象objectobjectDemo{}//trait(特质)traitDemo{}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。