一、 包
1、 package包
-
作用:将代码分类存放,便于管理
-
声明方式
- 采用java包的声明方式:每个文件单独在首行声明该文件属于那个包
- 采用scala特有的声明方式:使用 package包名{} 来声明包
2、 import导入类
-
作用:当一个类需要使用到非本包下的类时,需要import来导入
-
位置:scala导入语法可以声明在任何位置,建议在package包之后,类声明之前
-
导入形式
- 导入某个类:import 全限定类名
- 导入某一个包下的多个类:import 包名.{类名,类名…}
- 导入某个包的类并起一个别名:import 包名.{类名 => 别名}
- 导入某个包下的所有类:import 包名 _
-
scala默认导入的一些类
- java.lang._
- scala._
- scala.Perdef._
二、 类和对象
- 概念:类是用来组织代码结构的,对象是用来使用类中定义好的代码结构
1、 scala中类的定义语法
- 语法
[访问控制修饰符] class 类名{
属性
方法
构造器
//一般不会去写代码块和内部类
}
- scala类中的访问修饰符为private,protected,public,但是在scala中没有提供public这个关键字,在类中如果前面没有加访问控制修饰符,默认就是public
- scala中可以存在多个scala类,每个scala都可以是public权限
2、 scala类的属性的声明方法
- 语法
[修饰符] var|val 属性名称[: 类型] = 属性值
-
注意点
- scala类中声明的属性必须显示的声明初始值
- scala中非私有化属性可以通过@BeanProperty注解自动生成规范的getter和setter方法,私有化属性自动声明getter和setter方法,但是当属性是val修饰的常量属性,只会生成get方法
- scala属性也是可以具备默认值的,如果scala属性想要具备默认值,将scala属性值设置为_即可
注意:类的属性只有在var修饰的情况下才能使用_占位赋予默认值,val修饰的属性值不能被修改,无法使用_进行默认值赋予操作
3、 scala类的方法的声明语法
- 语法
[访问控制修饰符] def 方法名(形参列表):返回值类型 = {
方法体
}
- 类中的方法就是函数,只不过把函数声明在类中又称之为方法
4、 scala类的构造器的声明语法
-
scala构造器分为两种
- 主构造器
- 辅助构造器
1、 主构造器
主构造器是在声明类的时候就需要指定的
class ClassName [访问控制修饰符](形参列表){
}
注意点:如果主构造器是一个无参构造器,那么()可以省略
主构造器中的形参列表可以使用var/val修饰,也可以不加var/val 如果加上var/val 那么此时形参列表参数就是类中的一个属性
2、 辅助构造器
构造器函数,只不过函数名必须叫做this
辅助构造器函数的返回值是当前类,但是不能写返回值类型
[访问控制修饰符] def this (形参列表){
首行必须显示的直接调用或间接的调用主构造器this(参数列表)
属性的赋值操作
}
三、 面向对象的四大特征
- 封装
对类以及类中的资源使用访问控制修饰符进行修饰,用于控制类和类中资源(属性,方法,构造器) 谁能访问,谁不能访问,是对访问控制修饰符的一个使用
private 只有在本类中能使用
protected 只有本类和子类可以使用
public(不写权限 默认) 任何一个地方都可以访问
- 继承
scala可以使用extend关键字继承父类,scala和java一样也是单继承,一个子类只能继承一个直接父类
子类一旦继承父类,那么子类会具备父类所有非私有化的属性和方法,其中父类的protected修饰的属性和方法子类需要通过名字直接去调用
子类重新写了一个属性和方法与父类非私有化属性和方法重名了,必须在属性前和方法前加上一个override关键字,代表重写属性和方法
注意点:子类能具备父类的非私有化属性和方法,是因为子类持有父类的一个对象,对象是子类构造器在构建的时候调用的父类构造器,
默认情况下调用的父类的无参构造器,如果父类没有无参构造器或者无参构造器是私有化的,那么子类必须在继承父类的时候,
在父类后使用实参的形式调用父类的非私有化构造器创建父类对象
class Dog() extends Animal("zs",20){
}
- 多态
运行时类型和编译时类型,编译时类型使用父类,运行时类型使用子类给父类
scala也存在向上转型和向下转型
向上转型指的是编译时类型是父类,运行时类型是子类,可以直接转换
向下转型指的是编译时类型是子类,运行时类型是父类,不能直接转换,强转,scala中强转机制和java强转方式不一样的
对象名.asInstanceOf[子类类型]
注意事项:保证对象的运行时类型是子类类型或者是子类类型的一个子类,否则报错
- 抽象
抽象类
abstract class 类名{
抽象属性
非抽象方法
抽象方法
非抽象方法
}
抽象类中的抽象属性和抽象方法必须被抽象类的非抽象子类(抽象子类)重写,
重写的时候可以不加override关键字,但是如果重写抽象类中非抽象属性和非抽象方法 必须加override关键字
四、 特殊概念
- 匿名类
- 伴生对象
伴生对象是scala特有的一种说法,某一类的伴生对象,scala中没有static关键字,也就没有静态内容,但静态内容比较重要
scala为了弥补没有static静态关键字的缺点,增加了伴生对象,在伴生对象中声明的属性和方法类似于java中的静态属性和静态方法,可以直接使用类名进行调用
语法
object 类名{
属性
方法
}
注意事项:scala中伴生对象声明的属性和方法只能通过类名来调用,无法通过对象名类调用
伴生对象中有一个特殊的方法叫做apply方法,方法实现不通过new 关键字也可以创建类的对象
- 特质Trait
在scala中没有接口的概念,使用了一种叫特质的语法替代了接口语法,特质就是java中的接口弥补单继承的局限性,特质可以多实现
语法
triat 特质名{
普通属性
普通方法
抽象方法
抽象属性
}
特质使用的时候,如果子类已经继承了某个类,那么使用with 特质名去实现特质
如果特质没有继承类,那么使用extends继承特质即可
- 样例类case class
语法
case class (属性/主构造函数参数,默认使用val修饰)
样例类会帮助我们自动生成equals,hashcode,toString,伴生对象以及伴生对象中apply方法(apply方法
需要传递的参数就是主构造函数需要的参数值)getter setter 方法需要我们使用@BeanProperty手动生成