(数据科学学习手札46)Scala中的面向对象
一、简介
在Scala看来,一切皆是对象,对象是Scala的核心,Scala面向对象涉及到class、object、构造器等,本文就将对class中的重点内容进行介绍;
二、Scala中的类
2.1 普通类
在Scala中定义普通类的方式如下面的示例:
class Demo{
val name:String="类"
def introduce(): Unit ={
println("这是一个"+name)
}
}
即class+类名+{类中的内容,包括类自带的变量,自带的方法},而在class的定义中,也有一些特殊的方法:
1、private定义私有属性和方法
在class中定义属性或方法时在开头加上private关键词,则会将对应的属性或方法私有化,即只允许class中的方法调用该属性或方法:
//调用class中的非私有化属性和方法
object main{
def main(args: Array[String]): Unit = {
val demo = new Demo
demo.introduce()
println(demo.name)
}
} class Demo{
val name:String="类"
def introduce(): Unit ={
println("这是一个"+name)
}
}
object main{
def main(args: Array[String]): Unit = {
val demo = new Demo
//尝试调用class中的私用化属性和方法
println(demo.B)
println(demo.x)
}
} class Demo{
private val x:Int=1
def A: Int ={
B + x
}
private def B: Int ={
2
}
}
而调用非私有化的方法,虽然该方法中调用了class中的私有化属性和私有化方法,但这时代码运行是没有问题的:
object main{
def main(args: Array[String]): Unit = {
val demo = new Demo
//尝试调用class中的私用化属性和方法
println(demo.A) }
} class Demo{
private val x:Int=1
def A: Int ={
B + x
}
private def B: Int ={
2
}
}
2、类的继承
在Scala中,继承的关键字是extends:
object main{
def main(args: Array[String]): Unit = {
//调用父类中的introduce方法
val demoFather = new Father
demoFather.introduce
//调用子类1中继承自父类的introduce方法
val demoChild1 = new Child1
demoChild1.introduce
}
} //父类
class Father{
val name:String="father"
def introduce: Unit ={
println(name)
}
} //子类1
class Child1 extends Father{ }
子类通过override关键字来重写父类中的方法,如果要定义子类独特的方法,直接在子类的定义中书写即可:
object main{
def main(args: Array[String]): Unit = {
//调用父类中的introduce方法
val demoFather = new Father
demoFather.introduce
//调用子类1中继承自父类的introduce方法
val demoChild1 = new Child1
demoChild1.introduce
//调用子类1中自主的新方法
demoChild1.unique
}
} //父类
class Father{
val name:String="father"
def introduce: Unit ={
println(name)
}
} //子类1
class Child1 extends Father{
//复写父类中继承来的方法和属性
override val name: String = "son"
override def introduce: Unit = {
println(name)
}
def unique: Unit ={
println("I am unique!")
}
}
在父类中,被关键词final修饰的属性和方法不能被子类重写会提示错误:
3、class的传入参数
Scala中的class可以像定义函数一样传入一些必要或非必要参数,如下例:
无缺省值的参数,必须在初始化class的实例时定义:
object main{
def main(args: Array[String]): Unit = {
//初始化类的实例时传入无缺省必要参数
val demoFather = new Father(Firstname = "Zhang")
//调用类中的introduce方法
demoFather.introduce
}
} class Father(Firstname:String){
val Lastname:String="feifei"
def introduce: Unit ={
println(this.Firstname+Lastname)
}
}
有缺省值的参数:
object main{
def main(args: Array[String]): Unit = {
//调用类中的introduce方法,这里的参数有缺省值可以不传入
val demoFather = new Father()
demoFather.introduce
}
}
class Father(Firstname:String="Wang"){
val Lastname:String="feifei"
def introduce: Unit ={
println(this.Firstname+Lastname)
}
}
2.2 特质与混入
Scala中的特质用trait关键字来定义,混入用extends的方式,通过with以混入多个特质,下面是一个简单的演示:
object main{
def main(args: Array[String]): Unit = {
//调用混入后的方法
val vehicle = new Vehicle
vehicle.brand
vehicle.Amount
vehicle.amount
}
} //特质1
trait Car{
def brand: Unit ={
println("本田")
}
} //特质2
trait Wheel{
def amount: Unit ={
println("4个轮子")
}
} //特质3
trait Glass{
def Amount: Unit ={
println("深灰色的玻璃")
}
} //混入三个特质
class Vehicle extends Car with Wheel with Glass
以上就是本文的全部内容,若有笔误之处,望指出。
(数据科学学习手札46)Scala中的面向对象的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
随机推荐
- QA-IDEA中用maven配置项目无法加载JDBC
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Im building Maven Java Web application and w ...
- 2017U-Mail邮件营销平台新邮件模板功能
据U-Mail调查表明,企业用户中普遍最关心群发邮件会不会被列入垃圾箱?的确,哪怕你最用功,一旦邮件进了垃圾箱,意味着全盘尽废.业界知名服务商U-Mail一直想用户之所想,急用户之所急,十几年如一日, ...
- 邮件营销巧妙添加GIF让您的邮件动起来
动态图片远比静态图片要吸引人,因此近年来,一些营销人员也开始越来越频繁的使用GIF动画图片,适当的穿插和点缀动态图片,能够生动形象的表达出 主题,并且时不时令读者忍俊不禁.尤其是做邮件营销的,如果能在 ...
- BZOJ2756:[SCOI2012]奇怪的游戏(最大流,二分)
Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻 的格子,并使这两个数都加上 1. 现在 B ...
- Kali-linux基本设置
1.6.1 启动默认的服务 Kali Linux自带了几个网络服务,它们是非常有用的.但是默认是禁用的.在这里,将介绍使用各种方法设置并启动每个服务. 1. 启动Apache服务 启动Apache服务 ...
- 搭建一个redis高可用系统
一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...
- redis安装和简介(2)
承接上篇未完成的配置...此次使用的的 Redis-x64-3.2.100 版本 一.打开redis服务器 方式一:打开 redis-server.exe 显示如下图: 图中: 显示运行进程号.当前运 ...
- 一. Selenium介绍
1. 什么是Selenium 是web自动化测试工具集,主要包括:IDE.Grid.RC(Selenium1.0).WebDriver(Selenium2.0) 与其他工具的不同: 一般的脚本测试工具 ...
- rnnlm学习
rnn-lm: 1.论文 2.公式推导 2.1 http://blog.csdn.net/a635661820/article/details/44462315 3. 工具 lstm-lm 1. 论文 ...
- Kindeditor图片上传Controller
asp.net MVC Kindeditor 图片.文件上传所用的Controller [HttpPost, AllowAnonymous] public ActionResult UploadIma ...