Scala面向对象编程语法

本文介绍了Scala编程中的包管理,包括package的声明方式和import的使用。接着详细讲解了类和对象的概念,如类的定义语法、属性声明、方法声明以及构造器的声明。此外,还提到了面向对象的四大特性——封装、继承、多态和抽象。最后讨论了特殊概念,如匿名类、伴生对象和特质Trait。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 包

1、 package包

  • 作用:将代码分类存放,便于管理

  • 声明方式

    • 采用java包的声明方式:每个文件单独在首行声明该文件属于那个包
    • 采用scala特有的声明方式:使用 package包名{} 来声明包

2、 import导入类

  • 作用:当一个类需要使用到非本包下的类时,需要import来导入

  • 位置:scala导入语法可以声明在任何位置,建议在package包之后,类声明之前

  • 导入形式

    • 导入某个类:import 全限定类名
    • 导入某一个包下的多个类:import 包名.{类名,类名…}
    • 导入某个包的类并起一个别名:import 包名.{类名 => 别名}
    • 导入某个包下的所有类:import 包名 _
  • scala默认导入的一些类

    • java.lang._
    • scala._
    • scala.Perdef._

二、 类和对象

  • 概念:类是用来组织代码结构的,对象是用来使用类中定义好的代码结构

1、 scala中类的定义语法

  • 语法
[访问控制修饰符] class 类名{
	属性
	方法
	构造器
	//一般不会去写代码块和内部类
}
  • scala类中的访问修饰符为private,protected,public,但是在scala中没有提供public这个关键字,在类中如果前面没有加访问控制修饰符,默认就是public
  • scala中可以存在多个scala类,每个scala都可以是public权限

2、 scala类的属性的声明方法

  • 语法
[修饰符] var|val 属性名称[: 类型] = 属性值
  • 注意点

    • scala类中声明的属性必须显示的声明初始值
    • scala中非私有化属性可以通过@BeanProperty注解自动生成规范的getter和setter方法,私有化属性自动声明getter和setter方法,但是当属性是val修饰的常量属性,只会生成get方法
    • scala属性也是可以具备默认值的,如果scala属性想要具备默认值,将scala属性值设置为_即可
      注意:类的属性只有在var修饰的情况下才能使用_占位赋予默认值,val修饰的属性值不能被修改,无法使用_进行默认值赋予操作

3、 scala类的方法的声明语法

  • 语法
[访问控制修饰符] def 方法名(形参列表):返回值类型 = {
     方法体
}
  • 类中的方法就是函数,只不过把函数声明在类中又称之为方法

4、 scala类的构造器的声明语法

  • scala构造器分为两种

    • 主构造器
    • 辅助构造器
1、 主构造器
主构造器是在声明类的时候就需要指定的
class ClassName [访问控制修饰符](形参列表){
}
注意点:如果主构造器是一个无参构造器,那么()可以省略
	   主构造器中的形参列表可以使用var/val修饰,也可以不加var/val 如果加上var/val  那么此时形参列表参数就是类中的一个属性

2、 辅助构造器
构造器函数,只不过函数名必须叫做this
辅助构造器函数的返回值是当前类,但是不能写返回值类型
[访问控制修饰符]  def   this  (形参列表){
   首行必须显示的直接调用或间接的调用主构造器this(参数列表)
    属性的赋值操作
}

三、 面向对象的四大特征

  • 封装
对类以及类中的资源使用访问控制修饰符进行修饰,用于控制类和类中资源(属性,方法,构造器) 谁能访问,谁不能访问,是对访问控制修饰符的一个使用
private  只有在本类中能使用
protected  只有本类和子类可以使用
public(不写权限  默认)  任何一个地方都可以访问
  • 继承
scala可以使用extend关键字继承父类,scala和java一样也是单继承,一个子类只能继承一个直接父类
子类一旦继承父类,那么子类会具备父类所有非私有化的属性和方法,其中父类的protected修饰的属性和方法子类需要通过名字直接去调用
子类重新写了一个属性和方法与父类非私有化属性和方法重名了,必须在属性前和方法前加上一个override关键字,代表重写属性和方法

注意点:子类能具备父类的非私有化属性和方法,是因为子类持有父类的一个对象,对象是子类构造器在构建的时候调用的父类构造器,
	   默认情况下调用的父类的无参构造器,如果父类没有无参构造器或者无参构造器是私有化的,那么子类必须在继承父类的时候,
	   在父类后使用实参的形式调用父类的非私有化构造器创建父类对象
		class  Dog()   extends   Animal("zs",20){
		}
  • 多态
运行时类型和编译时类型,编译时类型使用父类,运行时类型使用子类给父类
scala也存在向上转型和向下转型
	向上转型指的是编译时类型是父类,运行时类型是子类,可以直接转换
	
	向下转型指的是编译时类型是子类,运行时类型是父类,不能直接转换,强转,scala中强转机制和java强转方式不一样的
	对象名.asInstanceOf[子类类型]
	注意事项:保证对象的运行时类型是子类类型或者是子类类型的一个子类,否则报错
  • 抽象
抽象类
abstract  class   类名{
    抽象属性
    非抽象方法
    抽象方法
    非抽象方法
}

抽象类中的抽象属性和抽象方法必须被抽象类的非抽象子类(抽象子类)重写,
重写的时候可以不加override关键字,但是如果重写抽象类中非抽象属性和非抽象方法  必须加override关键字

四、 特殊概念

  • 匿名类
  • 伴生对象
伴生对象是scala特有的一种说法,某一类的伴生对象,scala中没有static关键字,也就没有静态内容,但静态内容比较重要
scala为了弥补没有static静态关键字的缺点,增加了伴生对象,在伴生对象中声明的属性和方法类似于java中的静态属性和静态方法,可以直接使用类名进行调用

语法
object  类名{
    属性
    方法
}
注意事项:scala中伴生对象声明的属性和方法只能通过类名来调用,无法通过对象名类调用
伴生对象中有一个特殊的方法叫做apply方法,方法实现不通过new 关键字也可以创建类的对象
  • 特质Trait
在scala中没有接口的概念,使用了一种叫特质的语法替代了接口语法,特质就是java中的接口弥补单继承的局限性,特质可以多实现

语法
triat 特质名{
  普通属性
  普通方法
   抽象方法
   抽象属性
}

特质使用的时候,如果子类已经继承了某个类,那么使用with  特质名去实现特质
如果特质没有继承类,那么使用extends继承特质即可
  • 样例类case class
语法
case  class   (属性/主构造函数参数,默认使用val修饰)
样例类会帮助我们自动生成equals,hashcode,toString,伴生对象以及伴生对象中apply方法(apply方法
需要传递的参数就是主构造函数需要的参数值)getter  setter  方法需要我们使用@BeanProperty手动生成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值