Scala中的类和对象,实用样例详细解析!
发布日期:2021-09-11 14:30:16 浏览次数:27 分类:技术文章

本文共 4100 字,大约阅读时间需要 13 分钟。

hot3.png

Scala类

       简介
       类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
       Scala中的类不声明为public,一个Scala源文件中可以有多个类。
       Scala简单实例
``` import java.io._
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = ycdef move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点: " + x); println ("y 的坐标点: " + y); } }
object Test { def main(args: Array[String]) { val pt = new Point(10, 20);// 移到一个新的位置
pt.move(10, 10);
} } ```
       Scala抽象类
       抽象类是一种不能被实例化的类,抽象类中包括了若干不能完整定义的方法,这些方法由子类去扩展定义自己的实现。
``` abstract class Animal { //抽象字段(域) //前面我们提到,一般类中定义字段的话必须初始化,而抽象类中则没有这要求 var height:Int //抽象方法 def eat:Unit }
       //Person继承Animal,对eat方法进行了实现 //通过主构造器对height参数进行了初始化 class Person(var height:Int) extends Animal{ //对父类中的方法进行实现,注意这里面可以不加override关键字 def eat()={ println("eat by mouth") }
}
       //通过扩展App创建程序的入口 //App其实是一种trait,它帮助我们定义了main方法。 object Person extends App{ new Person(10).eat() } ```继承
       简介
       重写一个非抽象方法必须使用override修饰符。
       重写超类的抽象方法时,不需要使用override关键字。
       只有主构造函数才可以往基类的构造函数里写参数。
       继承会继承父类的所有属性和方法,Scala 只允许继承一个父类。
       Scala简单实例
``` class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = ycdef move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点: " + x) println ("y 的坐标点: " + y) } }
class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zcoverride def move(dx: Int, dy: Int) { x = x - dx y = y - dy println ("x 的坐标点: " + x) println ("y 的坐标点: " + y) }
def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("x 的坐标点 : " + x) println ("y 的坐标点 : " + y) println ("z 的坐标点 : " + z) } }
object Test { def main(args: Array[String]) { val loc = new Location(10, 20, 15);// 移到一个新的位置
loc.move(10, 10);
loc.move(10, 10, 5);
} } ```
       Scala单例对象
       简介
       在Scala中,是没有static的,但是提供了单例模式的实现方法,那就是使用关键字object。
Scala中使用单例模式时,除了定义的类之外,还要定义一个同名的 object对象,它和类的区别是,object对象不能带参数。
       简单实例
       object Student { private var studentNo:Int=0; def uniqueStudentNo()={ studentNo+=1 studentNo } def main(args: Array[String]): Unit = { println(Student.uniqueStudentNo()) } }
       伴生类与伴生对象
       简介
       当单例对象与某个类是同一个名称时,单例对象被称作是这个类的伴生对象,类被称为是这个单例对象的伴生类。必须在同一个源文件里定义伴生类和伴生对象。它们可以互相访问其私有成员。
简单实例
       ``` class Student(var name:String,var age:Int){ private var sex:Int=0 //直接访问伴生对象的私有成员 def printCompanionObject()=println(Student.studentNo) }
object Student { private var studentNo:Int=0; def uniqueStudentNo()={ studentNo+=1 studentNo } def main(args: Array[String]): Unit = { println(Student.uniqueStudentNo()) val s=new Student("john",29) //直接访问伴生类Student中的私有成员 println(s.sex) } } ```匿名类
       当某个类在程序中只使用一次时,可以将类定义为匿名类。
       ``` //抽象的Person类 abstract class Person(name:String,age:Int){ def walk():Unit }
object demo{ def main(args: Array[String]): Unit = { //下面的代码定义了一个匿名类,并且进行了实例化 //直接new Person("john",18),后面跟的是类的内容 //我们知道,Person是一个抽象类,它是不能被实例化的 //这里能够直接new操作是因为我们扩展了Person类,只不 //过这个类是匿名的,只能使用一次而已 val s=new Person("john",18){ override def walk()={ println("Walk like a normal Person") } } s.walk() } } ```
       多态与动态绑定
       简介
       多态(Polymorphic)也叫动态绑定(Dynamic Binding)、迟绑定(Late Binding),指在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法。子类的引用可以赋给父类。
       简单实例
       ``` //抽象Person类 abstract class Person(var name:String,var age:Int){def walk():Unit //talkTo方法,参数为Person类型 def talkTo(p:Person):Unit }
class Student(name:String,age:Int) extends Person(name,age){ private var studentNo:Int=0 def walk()=println("walk like a elegant swan") //重写父类的talkTo方法 def talkTo(p:Person)={ println("talkTo() method in Student") println(this.name+" is talking to "+p.name) } }
class Teacher(name:String,age:Int) extends Person(name,age){ private var teacherNo:Int=0def walk()=println("walk like a elegant swan")//重写父类的talkTo方法 def talkTo(p:Person)={ println("talkTo() method in Teacher") println(this.name+" is talking to "+p.name) } }
object demo{ def main(args: Array[String]): Unit = {//下面的两行代码演示了多态的使用
       //Person类的引用可以指向Person类的任何子类
       val p1:Person=new Teacher("albert",38)
       val p2:Person=new Student("john",38)
       //下面的两行代码演示了动态绑定
       //talkTo方法参数类型为Person类型
       //p1.talkTo(p2)传入的实际类型是Student
       //p2.talkTo(p1)传入的实际类型是Teacher
       //程序会根据实际类型调用对应的不同子类中的talkTo()方法p1.talkTo(p2)
       p2.talkTo(p1)
       } } ```

转载于:https://my.oschina.net/u/3980693/blog/2872968

转载地址:https://blog.csdn.net/weixin_34413802/article/details/92423485 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++实现string.replace(字符串替换)
下一篇:Jenkins实现Android自动化打包

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月16日 19时00分15秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

的流程图做完后如何保存_2019超火的半永久眉是哪款?做完后我们如何护理?... 2019-04-21
去除logo 高德地图api_深圳品牌logo升级如何保持原型的同时更具创新? 2019-04-21
二重积分转换成极坐标_二重积分转换极坐标r的范围如何确定? 2019-04-21
python中倒背如流_八字基础知识--倒背如流篇 2019-04-21
以太坊地址和公钥_以太坊地址是什么 2019-04-21
linux查看wifi信号命令_linux – 获取WIFI信号强度 – 寻求最佳方式(IOCTL,iwlist(iw)等)... 2019-04-21
npm 不重启 全局安装后_解决修复npm安装全局模块权限的问题 2019-04-21
vs格式化json 不生效_vs code 格式化 json 配置 2019-04-21
go 字符串反序列化成对象数组_Fastjson 1.2.24反序列化漏洞深度分析 2019-04-21
onmessage websocket 收不到信息_WebSocket断开重连解决方案,心跳重连实践 2019-04-21
hibernate mysql 缓存_hibernate和mysql的缓存问题,没辙了! 2019-04-21
abp框架 mysql_ABP框架使用Mysql数据库 2019-04-21
mysql树形递归删除_使用递归删除树形结构的所有子节点(java和mysql实现) 2019-04-21
linux mysql 不能连接远程_linux mysql 远程连接 2019-04-21
mysql $lt_mongodb中比较级查询条件:($lt $lte $gt $gte)(大于、小于)、查找条件... 2019-04-21
install python_Install python on AIX 7 2019-04-21
jquery查找div下第一个input_jquery查找div元素第一个元素id 2019-04-21
如何修改手机屏幕显示的长宽比例_屏幕分辨率 尺寸 比例 长宽 如何计算 2019-04-21
mysql 的版本 命名规则_MySQL版本和命名规则 2019-04-21
no java stack_Java Stack contains()用法及代码示例 2019-04-21