Scala_【6】面对对象

包的作用

  1. 区分相同名字的类
  2. 当类很多时,可以很好的管理类
  3. 控制访问范围

包的命名

  • 只能包含数字、字母、下划线,但不能用数字开头,也不要使用关键字
  • 一般是小写字母+小圆点,eg:com.公司名.项目名.业务模块名

包对象

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

导包说明

  1. 使用import导入,文件内所有的类都可以使用
  2. 通配符导入:import java.util._,将所有类导入进来
  3. 给类起别名:import java.util.{ArrayList=>AL}
  4. 导入相同包的多个类:import java.util.{ArrayList,HashSet}
  5. 屏蔽类:import java.util.{ArrayList=>_,_}

scala中的三个默认导入的包:

  • import java.lang._
  • import scala._
  • import scala.Predef._

类和对象

定义类:
	 [修饰符] class 类名 {
	   类体
	} 
	
定义属性:
	属性是类的一个组成部分
	[修饰符] var 属性名称 [:类型] = 属性值
	
定义方法:
	def 方法名(参数列表) [:返回值类型] = { 
		方法体
	}
	
创建对象:
	val | var 对象名 [:类型]  = new 类型()
  1. Scala语法中,类并不声明为public,所有这些类都具有公有可见性
  2. 一个Scala源文件可以包含多个类

在这里插入图片描述

封装

封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作,才能对数据进行操作

访问权限

  1. scala 中属性和方法的默认访问权限为public,但scala中无public关键字
  2. private为私有权限,只在类的内部和伴生对象中可用
  3. protected为受保护权限,Scala中受保护权限比Java中更严格,同类、子类可以访问,同包无法访问
  4. private[包名]增加包访问权限,包名下的其他类可以使用

在这里插入图片描述

构造器

Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法。
Scala类的构造器包括:主构造器和辅助构造器
基本语法:
	class 类名(形参列表) {  // 主构造器
	   // 类体
	   def  this(形参列表) {  // 辅助构造器
	   }
	   def  this(形参列表) {  //辅助构造器可以有多个...
	   }
	} 
(1)辅助构造器,函数的名称this,可以有多个,编译器通过参数的个数来区分。
(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。

在这里插入图片描述
在这里插入图片描述

构造器参数

  • 未用任何修饰
    • 未用任何修饰符修饰,这个参数就是一个局部变量
  • var修饰
    • var修饰参数,作为类的成员属性使用,可以修改
  • val修饰
    • val修饰参数,作为类只读属性使用,不能修改

在这里插入图片描述

继承

基本语法:
	class 子类名 extends 父类名  { 类体 }
(1) 子类继承父类的属性和方法
(2) scala是单继承
(3) 继承的调用顺序:父类构造器->子类构造器

、blog.csdnimg.cn/direct/95b0208755d74f0a8fa008c74ebf9138.png)

多态

多态是指同一个操作可作用于不同的对象

在这里插入图片描述

抽象属性和抽象方法

  • 抽象类
    • 通过abstract关键字标记抽象类
  • 抽象属性
    • 一个属性没有初始化,就是抽象属性
  • 抽象方法
    • 只声明而没有实现的方法,就是抽象方法

继承&重写

  1. 如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明为抽象类
  2. 重写非抽象方法需要用override修饰,重写抽象方法则可以不加override
  3. 子类中调用父类的方法使用super关键字
  4. 属性重写只支持val类型,而不支持var

在这里插入图片描述

匿名子类

直接在实例中重写属性和方法
在这里插入图片描述

单例对象(伴生对象)

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

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

在这里插入图片描述

apply方法

  1. 通过伴生对象的apply方法,实现不使用new方法创建对象
  2. 如果想让主构造器变成私有的,可以在()之前加上private
  3. apply方法可以重载
  4. Scala中obj(arg)的语句实际是在调用该对象的apply方法,即obj.apply(arg)

在这里插入图片描述

单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取该实例

在这里插入图片描述

特质

Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特征(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明,Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质

特质声明

trait 特质名 {
	trait体
}

基本语法

一个类具有某种特质(特征),就意味着这个类满足了这个特质(特征)的所有要素,所以在使用时,也采用了extends关键字,如果有多个特质或存在父类,那么需要采用with关键字连接

基本语法:
	没有父类:class  类名 extends  特质1   with    特质2   with   特质3 …
	有父类:class  类名  extends  父类   with  特质1   with   特质2  with 特质3…
  1. 类和特质的关系:使用继承的关系
  2. 当一个类去继承特质时,第一个连接词是extends,后面是with
  3. 如果一个类在继承特质和父类时,应当把父类写在extends后

在这里插入图片描述

动态混入

  1. 一个类可以混入(mixin)多个特质
  2. 动态混入:创建对象时混入trait,而无需使类混入该trait
  3. 如果混入的trait中有未实现的方法,则需要实现

在这里插入图片描述

特征叠加

由于一个类可以混入(mixin)多个trait,且trait中可以有具体的属性和方法,若混入的特质中具有相同的方法(方法名,参数列表,返回值均相同),必然会出现继承冲突问题

  • 解决冲突的方法
    • 直接在类中重写冲突方法

在这里插入图片描述

自身类型

自身类型可实现依赖注入的功能

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值