scala面向对象编程

scala面向对象编程

1.1类的定义

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

package com.dt.scala.oop
class Student{
private var privateAge=0
val name="Scala"
def age=privateAge
def 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.oop
class Teacher(val name:String,val age:Int){
var gender:String=_//_为占位符,可设置为NULL
println(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.oop

class Teacher{
var name=String
private var age=27
private[this] val gendr="male"
def this(name:String){
this
this.name=name
}
def sayHello()
{
println(this.name+":"+this.age+":"+this.gender)
}
}
object OOPInScala{
def main(args:Array[String]){
val p= new Teacher
p.name="Spark"
p.sayHello
}
}

3内部类与外部类

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

package com.dt.scala.oop
class 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.opp
trait 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 TraitLogger
logger.concreteLog
}//特质App中定义main的入口

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值