目录
第六章 面向对象
Scala的面向对象思想和Java的面向对象思想和概念是一致的。
Scala中的语法与Java不同,补充了更多的功能。
6.1 Scala 包
(1)基本语法
package 包名
(2)Scala包的三大作用(和Java一样)
(1)区分相同名字的类
(2)当类很多时,可以很好的管理类
(3)控制访问范围
6.1.1 包的命名
(1)命名规则
只能包含数字,字母,下划线,小圆点,当时不能用数字开头,也不要使用关键字。
(2) 案例实操
dome.class.execl //错误,因为class关键字
dome.12a //错误,数字开头
(3)命名规范
一般是小写字母+小圆点
com.公司名.项目名.业务模块名
6.1.2 包说明(包语句)
(1)说明
Scala有两种包的管理风格,一种方式和Java的包管理风格相同,每个源文件一个包(包名和源文件所在路径不要求必须一致),包名用 " ." 进行分隔以表示包的层级关系,如果com.atguigu.scala。另一种风格,通过嵌套的风格表示层级关系,如下
package com{
package atguigu{
package scala{
}
}
}
第二种风格有以下特点:
(1)一个源文件中可以声明多个package
(2)子包中的类可以直接访问父包中的内容,而无需导包
(2)案例实操
//用嵌套风格定义包
package com{
import com.atguigu.scala.Inner
//在外层包中定义单例对象
object Outer{
var out:String ="out"
def main(args: Array[String]): Unit = {
println(Inner.in)
}
}
package atguigu{
package scala{
//内层包中定义单例对象
object Inner{
val in:String ="in"
def main(args: Array[String]): Unit = {
println(Outer.out)
Outer.out="outer"
println(Outer.out)
}
}
}
}
}
//在同一文件中定义多个包
package aaa{
package bbb{
import com.atguigu.scala.Inner
object Test_packge{
def main(args: Array[String]): Unit = {
println(Inner.in)
}
}
}
}
6.1.3 包对象
在Scala中可以为每个包定义一个同名的包对象,定义在包对象中的成员,作为其对应包下所有class和object的共享变量,可以被直接访问。
(1)定义
package object com{
val shareValue ="share"
def ShareMethod()={}
}
(2) 说明
(1)若使用Java的包管理风格,则包对象一般定义在其对应包下的package.scala文件中,包对象与包名保持一致
Scala 提供包对象作为在整个包中方便的共享使用的容器。
包对象中可以定义任何内容,而不仅仅是变量和方法。 例如,包对象经常用于保存包级作用域的类型别名和隐式转换。 包对象甚至可以继承 Scala 的类和特质
按照惯例,包对象的代码通常放在名为 package.scala
的源文件中。
每个包都允许有一个包对象。 在包对象中的任何定义都被认为是包自身的成员。
6.1.4 导包说明
(1)和Java一样,可以在顶部使用import导入,在这个文件中的所有类都可以使用。
(2)局部导入:什么时候使用,什么时候导入,在其作用范围内都可以使用
(3)通配符导入:import Java.util
(4) 给类起名:import java.util.{ArrayList=>JL}
(5) 导入相同包的多个类:import java.util{HashSet,ArrayList}
(6)屏蔽类:import.java.util{ArrayList=>_,_}
(7)导入包的绝对路径:new _root_java.util.HashMap
(2)注意
Scala中的默认导入分别是
import java.lang._
import scala._
import scala.Predef._
6.2 类和对象
类:可以看成一个模板
对象:表示具体的事物
6.2.1定义类
(1)回顾:Java中的类
如果类是public的,则必须和文件名一致
一般,一个.java有一个public类
注意:Scala中没有public,一个.Scala中可以写多个类。
(1)基本语法
{修饰符}class 类名{
类体
}
说明:
(1)Scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
(2)一个Scala源文件可以包含多个类
(2)案例实操
创建对象,查看属性的实验
object Test01_class {
def main(args: Array[String]): Unit = {
//创建一个对象
val student =new Student()
//student.name
//error,不能访问private属性
println(student.sex)
println(student.age)
student.sex="ffaf"
println(student.sex)
}
}
//定义一个类
class Student{
//定义属性
private var name:String ="alice"
@BeanProperty
var age:Int = _
var sex:String= _
}
6.3封装
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据进行操作,Java封装操作如下
(1)将属性进行私有化
(2)提供一个公共的get方法,用于对属性赋值
(3)提供一个公共的get方法,用于获取属性的值
Scala中的public属性,底层实际为pricate,并通过get方法(obj.field())和set方法(obj。field_=(value))对其进行操作。所以Scala并不推荐属性设为private,再为其设置public的get方法和set方法。但是由于很多Java框架都利用反射调用getXXX和setXXX方法,有时候为了和这些框架兼容,也会为Scala的属性设置getXXX和SetXXX方法(通过@BeanProperty注解实现)