scala面向对象编程

来源:互联网 发布:黄金趋势分析软件 编辑:程序博客网 时间:2024/06/05 16:02

scala面向对象编程

1.1类的定义

由关键字、标识符、变量、方法和注释等内容组成,类声明处定义类的名称和类的访问权限及与其他类的关系,类体主要定义类的变量和方法。
如:
在工程的src目录的com.dt.scala.oop中新建HelloOOP对象

package com.dt.scala.oopclass Student{private var privateAge=0val name="Scala"def age=privateAgedef isYounger(other:Student)=privateAge<other.privateAge}object  HelloOOP{def main(args:Array[String]){val student =new Student  //val Student =new Student ()println(student.name)}}

1.2带有getter和setter的属性

在scala中getter和setter方法类似于privateAge和privateAge_=的定义,(privateAge_=为高阶函数)
如在上例中类Student定义变量privateAge,并没有显示定义属性的getter和setter函数,而在scala的编译码中生成了名字为privateAge的getter方法,
名字为privateAge_的setter方法。

2主构造器、私有构造器、构造器重载

2.1主构造器

scala中每个类都会有主构造器,主构造器和类定义在一起。构造器有共有构造器和私有构造器,私有只能在类内被访问。
1)参数直接放在类名之后
2)参数加val或var时自动升级为字段,其值被初始化为构造器传入的参数
3)除定义方法外,会执行类定义中所有语句

package com.dt.scala.oopclass Teacher(val name:String,val age:Int){var gender:String=_//_为占位符,可设置为NULLprintln(gender)def this(val name:String,val age:Int,val gender:String){this(name,age)this.gender=gender}}object OOPInScala{def main(args:Array[String]){val t=new Teacher("Spark",5)println(":"+t.age)}}

2.2构造器重载

辅助构造器名字为this, 先调用主构造器或其他已经定义的辅助构造器,再调用自己的命令

package com.dt.scala.oopclass Teacher{var name=Stringprivate var age=27private[this] val gendr="male"def this(name:String){thisthis.name=name}def sayHello(){println(this.name+":"+this.age+":"+this.gender)}}object OOPInScala{def main(args:Array[String]){val p= new Teacherp.name="Spark"p.sayHello}}

3内部类与外部类

Scala中允许在语法结构中内嵌语法结构,在函数中定义函数,再类中定义类

package com.dt.scala.oopclass Outer(val name:String){class Inner(val name:String){def foo(b:Inner)=println("Outer"+outer.name+"  Inner"+b.name)//b:inner改为b:Outer#Inner下面的调用类型不匹配的错误就能改掉。}}object OOPInScala{def amin(args:Array[String]){val outer1=new Outer("Spark")val outer2=new Outer("Hadoop")val inner1=new outer1.Inner("Scala")val inner2=new outer2.Inner("Java")inner1.foo(inner1);inner2.foo(inner2);//但在这种情况下inner1.foo(inner2)就会出错}}

4单例对象和伴生对象

scala中没有静态方法和静态字段,使用object对象表达静态的效果
伴生对象和类名同名的对象,既有实例方法又有静态方法,类和他的伴生对象可以相互访问私有属性,类和伴生对象需保存到同一源文件中

5继承

使用extends关键字进行继承,父类在此处被称为超类,在子类中重写字段或方法使用override关键字

6抽象

抽象类与C++中抽象类的性质相同,主要讲抽象字段和抽象方法,
使用abstract定义抽象字段,没有初始赋值,抽象方法性质类似,都存在于抽象类中,抽象类作为基类。方法由子类重写。

7trait特质

特质封装方法和字段的定义,java提共接口interface,scala提供trait特质,特质可拥有抽象和具体方法,类只能继承一个超类,但可以混入任意特质

package com.dt.scala.opptrait Logger{def log(msg:String){}}class concreateLogger extends Logger with Cloneable{def concreteLog{log("It's me")}trait TraitLogger extends Logger{override def log(msg:String){println("message:"+msg)}}object UseTrait extends App{val logger =new ConcreteLogger with TraitLoggerlogger.concreteLog}//特质App中定义main的入口

多重继承的顺序参考C++中的多类继承
包的定义package,包对象package object,
包的引用import  
import Scala.{StringBuilder=>}//将StringBuilder隐藏
import Scala.{StringBuilder=>stringB}//为StringBuilder起个别名
import Scala._//Scala包中所有东西

原创粉丝点击