一、面向对象
scala中没有static
object对象定义的方法和变量都是静态的
可以直接通过对象.方法|变量
scala的object叫对象
在scala中object都是单例的(一个类只能实例化一个对象)
(注:不能够new它的实例,构造方法是私有的)
二、class
定义:class类型
eg:
class Student{
var name : String
//数据可变,用var(对外提供了setter和getter方法)
//使用val需初始化值,且不可修改(对外只提供getter方法)
}
调用时可直接类名。变量名
eg:
val student = new Student()
student.name = "王八"
三、scala类的主辅构造器
1、跟在类后的构造器为主构造器
eg:
class Student(val name : String,val age : Int){}//若属性前什么都不加,则该属性仅仅为一个局部变量
2、辅助构造器
除了主构造器外,其他的构造器都是辅助构造器
eg:
class Student(var name : String,var age : Int){
var gender:Int = _
//定义一个辅助构造器使用this关键字
//在辅助构造器中心必须先调用主构造器
def this(gender : Int) = {
this(name,age)
this.gender = gender
}
def this(name : String,age : Int,gender : Int){
this(name,age)
this.gender = gender
}
}
3、空参构造器
类后面什么都不加默认会有一个空参构造器
四、成员属性、成员方法、构造器、类访问权限
1、成员属性访问权限
1)成员属性前若有private修饰,意味该属性是私有的,外部无法访问,伴生对象除外。
伴生对象:对象名称和类名称一致
伴生类:类名称和对象名称一致
注:伴生对象和伴生类必须在同一文件中
eg:
class Student(private val name : String){}
Object Student(){}
2)成员属性前有private[this]修饰,表示私有,别人不能访问,包括伴生对象
eg:
class Student(private[this] val name : String){}
2、成员方法访问权限(等同于成员属性)
3、构造器访问权限(等同于成员属性)
4、类的访问权限
1)类如果使用private修饰,同一包及其子包都可以访问,加[this]不影响结果
2)private[包名],在包下所有包都可以访问
五、apply
调用对象()时,默认调用的对象中的apply方法
eg:
def apply():Person = {
new Person(name = "lisi")
}
def main(args: Array[String]): Unit = {
val person = Person.apply()
}
eg:
def apply(name : String):Person = new Person(name)
六、scala中特质的定义 Trait及抽象类
1)Trait
类似java中的interface接口,不同于java,trait可有具体的方法实现(jdk1.8+接口也可定义具体的方法实现)
eg:
trait Human{
def play(str : String):Unit //只定义一个方法,无具体实现,若没有指定返回值,默认为Unit
def eat(food : String):Unit=println("eat "+food)//定义一个带具体实现的方法
}
可使用with实现trait
eg:
class Dog extends 抽象类1 with trait2
动态混入某一特质
eg:
val dog = new Dog() with trait1 //若trait1中有无具体实现方法,需将方法实现
2)抽象类
使用abstract关键字修饰,extends继承抽象类
重写方法
eg:
override def run : Unit = {.....}
override关键字:
1)父类方法没有具体实现时,可省略
2)父类方法有具体实现时,不可省略
注意:如果一个类没有显示的继承一个抽象类的话,可直接使用extends一个特质
(extends后可为特质,抽象类,但with后不能为抽象类)
七、final关键字
1)final修饰的类不能被继承
2)final修饰的方法不能被重写
3)final修饰的变量不能被重新赋值
八、type关键字
eg:
Type s = String //s表示String,s相当于String类型的一个别名
Type关键字可以和trait结合使用
eg:
trait A {
type T
def display(s:T)
}
class B extends A {
override Type T = Int
override def display(s:T):Unit=......
}