1.类和对象详解
1.1 组成结构
- 构造函数
- 成员变量
- 成员方法(函数)
- 局部变量
- 代码块
1.2 构造器的定义:
每个类都有一个主构造器,这个构造器和类定义"交织"在一起类名后面的内容就是主构造器,如果参数列表为空的话,()可以省略,scala的类有且仅有一个主构造器,要想提供更加丰富的构造器,就需要使用辅助构造器,辅助构造器是可选的,它们叫做this
注意:主构造器会执行类定义中的所有语句
1.3 构造器的总结
1,有两类构造器:主构造器,辅助构造器
2,构造器的定义位置,主构造器和类交织在一起,class Student2(val name: String, var age: Int)
3, 辅助构造器是一个特殊的方法,定义在类中 def this(name:String,age:Int,gender:String)
4,辅助构造器,第一行必须调用主构造器(或者其他的辅助构造器)
5,辅助构造器的参数不能和主构造器的参数完全一致(参数个数,参数类型,参数顺序)
6,可以定义空参的辅助构造器,但是主构造器的参数必须进行初始化赋值
7,作用域:辅助构造器的作用域,只在方法中,主构造器的作用域是类中除了成员属性和成员方法之外的所有范围(可以通过反编译查看源码)
1.4 构造器的参数说明
- 主构造器的参数没有使用var/val修饰 ,那么他的参数就是局部变量
- val修饰的构造函数的参数是类的成员私有属性 ,只读
- var修饰的构造函数的参数是类的私有成员属性 ,但是是可读可写的
2.成员变量
定义:定义在类中的变量称为成员变量,也可以定义在主构造器中
总结:
- 主构造函数中使用val 和 var修饰的变量为成员变量
- val 修饰的变量默认只有getter方法 一要初始化
- var 修饰的变量默认有 get和set方法 直接点属性操作 使用 _ 占位可以稍后赋值
- @BeanProperty会生成getMsg setMsg方法
3. 成员方法和成员函数
定义:在类的成员位置定义的函数或者方法是类的成员的一部分
4.局部变量
定义:定义在函数/方法的参数中 , 定义在代码块中 , 定义在流程控制的条件表达式中
注意 :
1 局部变量都需要设置初始值
2 局部变量的作用范围 ,定义在代码块中
5.伴生类和伴生对象
成为伴生类和伴生对象的条件:条件 1:在同一个源文件中, 条件 2:对象名和类名相同
特点:伴生对象和伴生类之间可以互相访问彼此的私有属性和私有方法
6 权限修饰符
定义:保护类成员属性不被修改
用private修饰的成员方法,不允许被其他类访问,用public修饰的属性或者方法的访问范围是本类和伴生类对象,需要注意的一点是,伴生类和伴生对象中,伴生类中的成员属性被private修饰,伴生对象可以随意访问;
scala中有更加严格的访问权限的控制:
- private [this] ,作用域为当前类中,伴生对象中无效
- private [packageName] 指定包及其子包有效
7. 特质和抽象类
什么是特质:
Trait(特质)相当于 java 的接口。比接口功能更强大。特质中可以定义属性和抽象方法和方法的实现。 Scala 的类只能够继承单一父类,但是可以实现(继承,混入)多个特质(Trait)使用的关 键字是 with 和 extends 注意:特质不能有主构造函数\
接口和类的区别:接口中不能写构造器,没有构造器,类可以写构造器,因为默认调用无参构造或者父类的构造器
7.1 动态混入
在使用的时候再实现具体的接口重写对应的抽象方法
new AnimalDemo {
override def eat(): Unit = {
println("实现吃的方法")
}
override def jum(): Unit = {
println("实现跳的方法")
}
}
8. 抽象类
在 Scala 中, 使用 abstract 修饰的类称为抽象类. 在抽象类中可以定义属性、未实现的方法
(抽象方法)和具体实现的方法。 含有抽象方法的类就是抽象类
- 抽象类中的属性
- 抽象方法
- 具体实现的方法
- 类的单继承
9. 样例类
使用case修饰的类就是样例类
1 构造器中的参数默认是val修饰的
2 样例类会自动创建伴生对象, 同时在里面实现;的apply和unapply方法 ,创建对象的时候不用new
3 很好的支持匹配模式
4 默认实现了自己的toString , hashCode , copy , equals方法
定义一个样例类:
case class Users( var uid:Int,var name:String,var gender:String)
10 高阶函数
定义:
- 函数的参数是函数的函数或者方法
- 函数的返回值是函数的函数或者方法
- 函数的参数和返回值都是函数的函数或者方法
高阶函数的优点:
使用高阶函数的一个原因是减少冗余的代码。比方说需要写几个方法以通过不同方式来提升员工工资,若不使用高阶函数,代码可能像这样