Scala(八)【面向对象总结】
面向对象总结
面向对象
1、scala包
1、声明包
1、在文件第一行通过package 包名
2、package 包名{
....
}
第二种方法,包名只能在target目录才能看到
2、导入包
1、导入包下所有类: import 包名._
2、导入包下多个类: import 包名.{类名1,类名2,..}
3、导入包下除开个别类的所有类型: import 包名.{不导入的类名=>_,_}
4、给类起别名: import 包名.{类名=>别名}
3、包对象
1、语法: package object 包名
包对象中定义变量、方法、函数在包中任何地方都可以使用
2、类和对象
1、类
1、语法: class 类名
2、定义属性:
class 类名{
val/var 变量:变量类型 = 值
//var定义的变量可以通过_赋予初始值:null、0、false、0.0
}
3、定义方法: 与之前定义方法的语法一样
2、对象: new 类名
3、构造器
1、主构造器: 列名后面的()代表主构造器。在主构造器中可以定义成员属性
class 类名(val 属性名:类型[= 默认值],var 属性名:类型 [= 默认值], 属性名:类型[=默认值])
在主构造器中定义属性的时候:val\var\不带val、var的区别:
val:不可修改,有默认的get方法
var:可以修改,有默认的get\set方法
不带val、var: 只能在类中使用。而且如果该属性没有在class中使用,相当于没有。如果使用,则会生成一个private的属性。只是这个属性没有get/set方法
2、辅助构造器:
1、语法: def this(参数名:参数类型,...) = {
//第一行调用其他的辅助构造器或者主构造器
}
辅助构造器可以重载
4、构造器参数:
1、主构造器中属性可以给默认值
2、在创建对象的时候,可以通过带名参数来指定将值赋给哪个属性
5、封装: *****
为了兼容java,生成java的get/set方法。
只需要在属性名上面添加注解:@BeanProperty。
6、继承: 语法和java一样,都是通过extends关键字实现继承
哪些不能够被继承:
1、final修饰的class不能被继承
2、private修饰的成员变量、成员方法不可被继承
哪些不能够被重写
1、final修饰的val定义的属性不可用被重写
2、var修饰的属性不可以被重写
重写: 通过override关键字标识方法/属性被重写
7、多态:
1、java中多态是表现在方法上
2、scala中方法和属性都会多态
8、抽象类: 通过abstract关键字标识类为抽象类
1、抽象类中既可以定义抽象方法[没有方法体]也可以定义具体方法
2、抽象类中既可以定义抽象属性[没有赋初始值的属性]也可以定义具体属性
3、匿名子类:
new 抽象类{
//实现抽象类的抽象方法和抽象属性
}
9、伴生类和伴生对象
需要满足两个条件:
1、class名和object名一样
2、class与object在同一个源文件中
class称之为伴生类,object伴生对象
伴生类和伴生对象相互之间可以调用对方的私有属性或者方法
apply方法:
apply方法定义在伴生对象中
使用来简化伴生类实例的创建
def apply(变量名:变量类型,..) = new 伴生类(变量名,..)
有了apply方法之后,后续创建伴生类实例的时候就可以通过以下方式创建:
1、类名.apply(值,..)
2、类名(值,...)
上面两种形式是完全等价
10、特质
1、定义语法: trait 特质名{...}
2、scala中是单继承,多混入
3、特质和抽象类很像,都是既可以定义抽象方法也可以定义具体的方法
既可以定义抽象属性也可以定义具体的属性
4、如何混入特质?
1、如果子类需要继承父类,先通过extends关键字继承父类,后面通过with关键字混入特质
2、如果子类不需要继承父类,第一个特质通过extends关键字混入,其他的特质通过with关键字混入
5、子类混入多个特质,这多个特质中都是同名的方法,如何处理?
1、如果这多个特质没有关系[没有相同的父类/父特质]:
直接重写同名方法。如果重写之后,在方法体中需要调用父特质同名的方法。只会调用最后一个特质的同名方法
2、如果这多个特质有关系[属于同一个父特质]
直接重写同名方法。如果重写之后,在方法体中需要调用父特质同名的方法。根据混入的顺序,从右往左开始调用,共同父特质的同名方法最后才调用
class A extends B with C with D{
overirde def m1() = {
println("...")
super.m1()
}
}
B、C、D继承AA
A[m1]->D[m1]->C[m1]->B[m1]->AA[m1]
6、对象混入:
语法: new 对象 with 特质名
通过对象混入,可以实现将某些对象有特质的特征[属性/方法/函数]
7、特质的自身类型:
语法:
trait 特质名{
this:类型=> //子类要想混入当前的特质,必须继承/混入指定的class/trait
}
11、扩展
1、类型检查、转换 *****
对象.isInstanceOf[类型] : 用来判断对象是否属于某个类型
对象.asInstanceOf[类型]: 用来将对象转为指定的类型
对象.getClass: 获取对象的class形式
classOf[类名]: 获取类的class形式
2、枚举类、应用类:
枚举类: 继承 Enumeration
应用类: 继承 App
继承App之后,就可以不用写main方法。在object中的代码就是相当于写在main方法里面
3、type定义新类型: 给类起别名
type s = String
val name:s = "xxx"
Scala(八)【面向对象总结】的更多相关文章
- Scala之面向对象
1. Scala基础练习 不使用str.toLong,str.toInt/Integer.valueOf()/Long.valueOf/Integer.parseInt()等,将字符串"12 ...
- Scala语言面向对象
apply1. 面向对象的基本概念: 把数据及对数据的操作方法放在一起,作为一个相互依存的整体-----对象,面向对象的三大特征:封装.多态.继承 2. scala类的定义 · class Emplo ...
- Scala学习——面向对象
Scala面向对象 三大特征:封装.继承.多态 1.类的定义和使用 package top.ruandb.scala.Course02 object Simple { def main(args: A ...
- python基础(八)面向对象的基本概念
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对 ...
- scala的面向对象编程
1.scala的简单编程 2.构造方法 辅助构造函数是在主构造函数没有的情况下,执行的构造函数. 3.object的介绍 4.半生类和半生对象 5.半生的案例程序(半生类可以调用半生) 6.apply ...
- python运维开发(八)----面向对象(下)
内容目录: 面向对象三大特性之多态性 面向对象中的成员:字段.方法.属性 类的成员修饰符 类的特殊成员 特殊成员方法 面向对象其他 异常处理 设计模式之单例模式 面向对象的多态性 多态性:即指多种形态 ...
- 第2节 Scala中面向对象编程:12、13、14、15、16、trait
6.4. Scala中面向对象编程之trait 6.4.1. 将trait作为接口使用 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java ...
- 第2节 Scala中面向对象编程:9、getClass和classOf;10、调用父类的constructor;11、抽象类和抽象字段;
6.3.4. Scala中getClass 和 classOf Class A extends class B B b=new A b.getClass ==classOf[A] B b ...
- 第2节 Scala中面向对象编程:7、继承的概念以及override和super关键字;8、isInstanceOf 和 asInstanceOf关键字
6.3. Scala面向对象编程之继承 6.3.1. Scala中继承(extends)的概念 Scala 中,让子类继承父类,与 Java 一样,也是使用 extends 关键字: 继承 ...
随机推荐
- Win10自动备份oracle数据库
1.环境 操作系统:win10 数据库: 2.创建backup.bat文件 [ @echo offset name=%date:~0,4%%date:~5,2%%date:~8,2%set backu ...
- JavaJDK下载及配置环境变量
卸载jdk 找到原先安装jdk的位置,直接删除这个文件夹,你们叫什么名字就删哪个,我的叫javajdk. 找到我的电脑,右键属性,然后找到环境变量. 删除系统变量里面的JAVA_HOME变量 再双击击 ...
- JMeter进行压力测试时查看服务器的资源使用
用户想要使用Jmeter监控所测试的服务器的资源使用情况,需要有Jmeter客户端插件和服务端插件 1.客户端插件 下载地址:https://jmeter-plugins.org/install/In ...
- 【数据结构&算法】12-线索二叉树
目录 前言 线索二叉树的概念 线索二叉树的实现 线索二叉树的寻点思路二 类双向链表参考图 参考代码 中序遍历线索化 前言 在<大话数据结构>P190 页中有一句话:其实线索二叉树,就等于是 ...
- Vue组件传值prop验证方式
在Vue组件开发过程中,父组件要经常给子组件传递数据,在传递数据的过程中,子组件可以使用prop来接收父组件传递的值,同时呢,我们可以为组件的 prop 指定验证要求,例如你知道的这些类型.如果有一个 ...
- go微服务框架Kratos笔记(六)链路追踪实战
什么是链路追踪 借用阿里云链路追踪文档来解释 分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等,它为分布式应用的开发者提供了完整的调用链路还 ...
- 印象最深的一个bug:sessionStorage缓存在移动端失效
无bug,不程序:作为程序员的我,不是修bug就是在写bug的路上. 移动端sessionStorage缓存失效是我"印象最深的一个bug"之一,为啥呢,因为这个问题导致我加班到很 ...
- 14-1-Unsupervised Learning ---dimension reduction
无监督学习(Unsupervised Learning)可以分为两种: 化繁为简 聚类(Clustering) 降维(Dimension Reduction) 无中生有(Generation) 所谓的 ...
- [cf582E]Boolean Function
由于每一个运算都有括号,因此添加的运算不会改变运算顺序 先将其建出一棵表达式树,也就是维护两个栈,是节点和运算符优先级单调递增的栈(设置左括号优先级最低,右括号弹出直至左括号) 每一次运算,也就是新建 ...
- vue 3 学习笔记 (六)——watch 、watchEffect 新用法
选项式API与之前写法相同,本篇文章主要通过 Options API 和 Composition API 对比 watch 的使用方法,让您快速掌握 vue3 中 watch 新用法.建议收藏! 一. ...