一,项目中的package
在一个项目中,不同的包可以有相同的类名而不引发冲突;
命名规则:只能包含数字、字母、下划线、小圆点.,但不能用数字开头, 也不要使用关键字;一般是小写字母+小圆点,一般是 com.公司名.项目名.业务模块名
包可以包含类、对象和特质 trait,但不能包含函数/方法或变量的定义。
1) 在 Scala 中,import 语句可以出现在任何地方,并不仅限于文件顶部,import 语句的作用一直 延伸到包含该语句的块末尾。这种语法的好处是:在需要时在引入包,缩小 import 包的作用范围,提 高效率。
二、
三、
四、
五、面向对象3特征
封装、继承和多态
封装(encapsulation)就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作;
1) Scala 中为了简化代码的开发,当声明属性 var 时,本身就自动提供了对应 setter/getter 方法,如 果属性声明为 private 的,那么自动生成的 setter/getter方法也是 private 的,如果属性省略访问权限修饰符,那么自动生成的 setter/getter 方法是 public;
2) 因此我们如果只是对一个属性进行简单的 set 和 get ,只要声明一下该属性(属性使用默认访问修饰符) 不用写专门的 getset,默认会创建,访问时,直接对象.变量。这样也是为了保持访问一致性
3) 从形式上看 dog.food 直接访问属性,其实底层仍然是访问的方法
4) 有了上面的特性,目前很多新的框架,在进行反射时,也支持对属性的直接反射
继承:
Scala 支持类的单继承,class 子类名 extends 父类名 { 类体 }
1) 代码的复用性提高了
2) 代码的扩展性和维护性提高了
子类继承了所有的属性,只是私有的private属性不能直接访问,需要通过公共的方法去访问
scala 明确规定,重写一个非抽象方法需要用 override 修饰符,调用超类的方法使用 super 关键字
类型检查和转换:
要测试某个对象是否属于某个给定的类,可以用 isInstanceOf 方法。用 asInstanceOf 方法将引用转换为子类的引用。classOf 获取对象的类名
classOf[String]就如同 Java 的 String.class 。 obj.isInstanceOf[T]就如同 Java 的 obj instanceof T 判断 obj 是不是 T 类型。 obj.asInstanceOf[T]就如同 Java 的(T)obj 将 obj 强转成 T 类型。
def main(args: Array[String]): Unit = {
//ClassOf 的使用,可以得到类名
println(classOf[String]) // 输出
val s = "king"
println(s.getClass.getName) //使用反射机制
//isInstanceOf asInstanceOf
var p1 = new Person200
var emp = new Emp200
//将子类引用给父类(向上转型,自动)
p1 = emp
//将父类的引用重新转成子类引用(多态),即向下转型
var emp2 = p1.asInstanceOf[Emp200]
emp2.sayHello()
}
//Person 类
class Person200 {
var name: String = "tom"
def printName() { //输出名字
println("Person printName() " + name)
}
def sayHi(): Unit = {
println("sayHi...")
} }
class Emp200 extends Person200 {
//这里需要显式的使用 override
override def printName() {
println("Emp printName() " + name)
//在子类中需要去调用父类的方法,使用 super
super.printName()
sayHi()
}
def sayHello(): Unit = {
} }
类型检查和转换的最大价值在于:可以判断传入对象的类型,然后转成对应的子类对象,进行相关操作,这里也体现出多态的特点
Scala 中超类的构造:
该章节未完待续!!!