面向对象编程
1.基础面向对象编程
1.1 包
1. 可以让源码文件中多次使用package关键字
2. 源码物理路径和包名没有关系,就算报名不对,一样可以执行
3. 明确包的作用域,可以在package关键字的后面增加大括号
4. 同一个源码中,子包中可以直接访问父包中的内容
5. scala可以将包当成对象来用,可以直接声明属性和方法
1.2 import
1. 星号在scala中有特殊用于,所以不能使用在import语法中,需要采用特殊符号:下划线
import java.util._
2. import关键字可以在任何地方使用
import java.util.Date
new Date()
导入Date时容易造成歧义
3. 可以在一行中导入同一个包中多个类并且可以给类起别名
import java.util.{ArrayList, List, LinkedList}
new ArrayList()
import java.util.{HashMap=>JavaHashMap}
println(new JavaHashMap())
4. 导包,而不是导类
import java.util
new util.ArrayList()
5.Scala中可以屏蔽某个包中的类
import java.util._
import java.sql.{Date=>_, _} //java.sql包中屏蔽Date日期类
new Date()
6. scala中导入类的操作,是以相对路径(当前包路径)的方式导入的。如果想要使用绝对路径的方式,那么需要增加特殊操作:root
new _root_.java.util.HashMap()
1.3 类
Scala中一个源文件中可以声明多个公共类
// 声明类:访问权限 class 类名 { 类主体内容 }
class User {
// 类的主体内容
}
// 对象:new 类名(参数列表)
new User()
1.3 属性
所谓的属性,其实就是类中的变量
在编译时,编译器会将变量编译为类的(私有的)属性,同时提供了属性对应的set,get方法
val test = new Test()
给类的属性赋值,等同于调用对象属性的set方法
test.name = "lisi"
访问类的属性时,等同于调用对象属性的get方法
println(test.name)
使用 val声明的类的变量,取值不能修改
val声明的属性,在编译时,会给属性添加final关键字,编译器不会提供属性的set方法
test.age = 20
scala中变量必须显示地初始化
如果希望类的属性和java一样可以由系统进行初始化,而是手动赋值,可以采用特殊符号:下划线
java bean规范
反射一般用于架构设计,而架构设计的目的就是通用化
scala中给属性提供的set,get方法不遵循bean规范
sql => cols => [id ,name, age] => getId, getName, getAge
class Test {
// 声明属性
// private String name = "zhangsan";
// private final int age = 30;
private var name : String = "zhangsan"
val age : Int = 30
@BeanProperty var email : String = _
}
添加@BeanProperty之后,就符合Bean规范了,然后就可以使用set/get方法了
1.3 访问权限
java :
1. private => 本类
2. (default) => 本类,本包
3 protected => 本类,本包,子类
4. public => 任意
scala :
1. private => 同类
2. private[包名] => 同包,包私有
3. protected => 受保护的, 同类,子类,没有同包
4. (default) => 什么都不写就是公共的。没有public关键字
1.4 方法
动态绑定 只是针对成员方法来说,成员属性还有静态方法不满足动态绑定
2.高阶面向对象编程