四、Scala面向对象

Scala的面向对象思想和Java的面向对象思想和概念是一致的。
Scala中语法和Java不同,补充了更多的功能。

1.Scala包

1)基本语法
package 包名
2)Scala 包的三大作用(和 Java 一样)
(1)区分相同名字的类
(2)当类很多时,可以很好的管理类
(3)控制访问范围

1.1 包的命名

1)命名规则
只能包含数字、字母、下划线、小圆点.,但不能用数字开头,也不要使用关键字。
2)案例实操
demo.class.exec1 //错误,因为 class 关键字
demo.12a //错误,数字开头
3)命名规范
一般是小写字母+小圆点
com.公司名.项目名.业务模块名
4)案例实操

com.atguigu.oa.model 
com.atguigu.oa.controller
com.sohu.bank.order 

1.2 包说明

1)说明
Scala 有两种包的管理风格,一种方式和 Java 的包管理风格相同,每个源文件一个包(包
名和源文件所在路径不要求必须一致),包名用“.”进行分隔以表示包的层级关系,如
com.atguigu.scala。另一种风格,通过嵌套的风格表示层级关系,如下

package com{
package atguigu{
package scala{
}
}
}

第二种风格有以下特点:
(1)一个源文件中可以声明多个 package
(2)子包中的类可以直接访问父包中的内容,而无需导包
2)案例实操

package com {
 import com.atguigu.Inner //父包访问子包需要导包
 object Outer {
 val out: String = "out"
 def main(args: Array[String]): Unit = {
 println(Inner.in)
 }
 }
 package atguigu {
 object Inner {
 val in: String = "in"
 def main(args: Array[String]): Unit = {
 println(Outer.out) //子包访问父包无需导包
 }
 }
 }
}
package other {

1.3 包对象

在Scala中可以为每个包定义一个同名的包对象,定义在包对象中的成员,作为其对应包下所有所有class和object的共享变量,可以直接访问。

package object com{
val shareValue="share"
def shareMethod()={}
}

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语言是完全面向对象的语言,所以没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(Java中有静态概念),就产生了一种特殊的对象来模拟类对象,称为单例对象。若单例对象与类名一致,则称该单例对象是这个类的伴生对象,这个类的所有静态内容都可以在伴生对象中声明。

2.1 单例对象语法

//(1)伴生对象采用 object 关键字声明
object Person {
 var country: String = "China"
}
//(2)伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
class Person {
 var name: String = "bobo"
}
object Test {
 def main(args: Array[String]): Unit = {
 //(3)伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访
问。
 println(Person.country)
 }
}

2)说明
(1)单例对象采用 object 关键字声明
(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

2.2 apply方法

1)说明
(1)通过伴生对象的 apply 方法,实现不使用 new 方法创建对象。
(2)如果想让主构造器变成私有的,可以在()之前加上 private。
(3)apply 方法可以重载。
(4)Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用
以统一面向对象编程和函数式编程的风格。
(5)当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构
建对象时,调用的其实时伴生对象的 apply 方法。

object Test {
 def main(args: Array[String]): Unit = {
 //(1)通过伴生对象的 apply 方法,实现不使用 new 关键字创建对象。
 val p1 = Person()
 println("p1.name=" + p1.name)
 val p2 = Person("bobo")
 println("p2.name=" + p2.name)
 }
}
//(2)如果想让主构造器变成私有的,可以在()之前加上 private
class Person private(cName: String) {
 var name: String = cName
}
object Person {
 def apply(): Person = {
 println("apply 空参被调用")
 new Person("xx")
 }
 def apply(name: String): Person = {
 println("apply 有参被调用")
 new Person(name)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值