[Scala] 面向对象
类定义
- 当属性是private时,scala会自动为其生成get和set方法
- 只希望scala生成get,不生成set,可定义为常量
- 不生成get和set方法,使用private[this]关键字
1 package day0106
2
3 class Student1 {
4 private var stuID:Int = 0
5 private var stuName:String="Tom"
6 private var age:Int = 20
7
8 def getStuName():String=stuName
9 def setStuName(newName:String) = this.stuName = newName
10 def getStuAge():Int = age
11 def setStuAge(newAge:Int) = this.age = newAge
12 }
13 object Student1{
14 def main(args: Array[String]): Unit = {
15 //创建学生对象
16 var s1 = new Student1
17
18 //访问set方法
19 println(s1.getStuName()+"\t"+s1.getStuAge())
20
21 //输出,直接访问私有属性
22 s1.setStuName("Mary")
23 s1.setStuAge(25)
24 println(s1.getStuName()+"\t"+s1.getStuAge())
25
26 //访问私有属性
27 println(s1.stuName+"\t"+s1.age)
28 }
29 }

内部类
- 在一个类内部定义另外一个类
1 package day0601
2
3 import scala.collection.mutable.ArrayBuffer
4
5 class Student1 {
6 private var stuName:String = "Tom"
7 private var stuAge:Int = 20
8
9 //定义一个可变数组保存学生的课程成绩
10 private var courseList = new ArrayBuffer[Course]()
11
12 //定义一个函数用于添加学生的课程成绩
13 def addNewCourse(cname:String,grade:Int){
14 var c = new Course(cname,grade)
15 courseList += c
16 }
17
18 //定义一个课程类:主构造器写在类的后面
19 class Course(val courseName:String,val grade:Int){
20 //其他函数
21 }
22 }
23
24 object Student1{
25 def main(args: Array[String]):Unit = {
26 var s = new Student1
27
28 s.addNewCourse("Chinese", 80)
29 s.addNewCourse("Math", 80)
30 s.addNewCourse("English", 80)
31
32 println(s.stuName + "\t" + s.stuAge)
33 println("*********成绩信息**********")
34 for(c <- s.courseList)
35 println(c.courseName+'\t'+c.grade)
36 }
37 }

构造器
- 主构造器:和类的声明在一起,一个类只有一个主构造器
- 辅助构造器:一个类有多个辅助构造器,通过关键字this
1 package day0601
2
3 class Student2(var stuName:String,var age:Int){
4 def this(age:Int){
5 // 在辅助构造器中调用主构造器
6 this("no name",age)
7 println("调用辅助构造器")
8 }
9 //定义其他的辅助构造器
10 }
11
12 object Student2 {
13 //测试程序
14 def main(args:Array[String]):Unit = {
15
16 //使用主构造器
17 var s1 = new Student2("Tom",20)
18 println(s1.stuName+"\t"+s1.age)
19
20 //使用辅助构造器
21 var s2 = new Student2(25)
22 println(s2.stuName+"\t"+s2.age)
23 }
24 }

Object对象
- Object中的内容都是静态的
- Scala中,没有静态修饰符static
- 如果class的名字和object的名字一样,把这个object叫做类的伴生对象
- 可使用Object实现单例模式(Java中构造器定义为private,提供getInstance方法)
- 使用App对象(应用程序对象),可省略main方法
1 package day0601
2
3 object HelloWorld extends App{
4 // def main(args:Array[String]): Unit = {
5 // println("Hello World")
6 // }
7 //把main函数中的程序直接写在object中
8 println("Hello World")
9
10 if(args.length > 0){
11 println("有参数")
12 }else{
13 println("没有参数")
14 }
15 }
Hello World
没有参数
apply方法
- 可以省略new关键字
- 必须写在伴生对象中
- 类似辅助构造器
1 package day0601
2
3 class student3(var stuName:String)
4
5 object student3 {
6 //定义apply方法
7 def apply(name:String)={
8 println("*******调用apply方法********")
9 new student3(name)
10 }
11
12 def main(args:Array[String]): Unit = {
13 //通过主构造器创建对象
14 var s1 = new student3("Tom")
15 println(s1.stuName)
16
17 //通过apply方法创建对象
18 var s2 = student3("Mary")
19 println(s2.stuName)
20 }
21 }

继承
- override:用子类中的值覆盖父类中的值
1 package day0601
2
3 //定义父类
4 class Person(val name:String,val age:Int) {
5 def sayHello():String = "Hello"+name+" and the age is "+age
6 }
7
8 //定义子类
9 class Employee(override val name:String,override val age:Int,var salary:Int) extends Person(name,age)
10
11 object Demo1{
12 def main(args:Array[String]):Unit = {
13 // 创建Person对象
14 var p1 = new Person("Tom",20)
15 println(p1.name+"\t"+p1.age)
16 println(p1.sayHello())
17
18 // 创建Employee对象
19 var p2:Person = new Employee("Mike",25,1000)
20 println(p2.sayHello())
21 }
22 }

- 重写方法
1 package day0601
2
3 //定义父类
4 class Person(val name:String,val age:Int) {
5 def sayHello():String = "Hello"+name+" and the age is "+age
6 }
7
8 //定义子类
9 class Employee(override val name:String,override val age:Int,var salary:Int) extends Person(name,age){
10 //重写父类函数
11 override def sayHello():String = "子类中sayHello方法"
12 }
13
14 object Demo1{
15 def main(args:Array[String]):Unit = {
16 // 创建Person对象
17 var p1 = new Person("Tom",20)
18 println(p1.name+"\t"+p1.age)
19 println(p1.sayHello())
20
21 // 创建Employee对象
22 var p2:Person = new Employee("Mike",25,1000)
23 println(p2.sayHello())
24 }
25 }

- 匿名子类
1 package day0601
2
3 //定义父类
4 class Person(val name:String,val age:Int) {
5 def sayHello():String = "Hello"+name+" and the age is "+age
6 }
7
8 //定义子类
9 class Employee(override val name:String,override val age:Int,var salary:Int) extends Person(name,age){
10 //重写父类函数
11 override def sayHello():String = "子类中sayHello方法"
12 }
13
14 object Demo1{
15 def main(args:Array[String]):Unit = {
16 // 创建Person对象
17 var p1 = new Person("Tom",20)
18 println(p1.name+"\t"+p1.age)
19 println(p1.sayHello())
20
21 // 创建Employee对象
22 var p2:Person = new Employee("Mike",25,1000)
23 println(p2.sayHello())
24
25 // 通过匿名子类实现继承
26 var p3:Person = new Person("Mary",25){
27 override def sayHello():String = "匿名子类中sayHello方法"
28 }
29 println(p3.sayHello())
30 }
31 }

- 抽象类
1 package day0601
2
3 abstract class Vehicle{
4 def checkType():String
5 }
6
7 class Car extends Vehicle{
8 def checkType():String = "I am a Car"
9 }
10
11 class Bike extends Vehicle{
12 def checkType():String = "I am a Bike"
13 }
14
15
16 object Demo2 {
17 def main(args:Array[String]):Unit={
18 var v1:Vehicle = new Car
19 println(v1.checkType())
20
21 var v2:Vehicle = new Bike
22 println(v2.checkType())
23 }
24 }
- 抽象字段
1 package day0601
2
3 abstract class Person1{
4 //定义抽象字段,只有get方法
5 val id:Int
6 val name:String
7 }
8
9 //若子类中没有提供父类的抽象字段的初始值,子类必须也是抽象的
10 abstract class Employee1 extends Person1{
11
12 }
13
14 //若不提供初始值,可把抽象字段放到构造器中
15 class Employee2(val id:Int,val name:String) extends Person1{
16 //val id:Int = 1
17 //val name:String = ""
18 }
19
20 object Demo3 {
21
22 }
trait(特质)
- 本质是抽象类,支持多重继承
1 package day0601
2
3 //代表人
4 trait Human{
5 val id:Int
6 val name:String
7 }
8 //代表动作
9 trait Actions{
10 def getActionName():String
11 }
12
13 //把抽象字段放入构造器
14 class Student4(val id:Int,val name:String) extends Human with Actions{
15 def getActionName():String = "Action is running"
16 }
17
18 object Demo4 {
19 def main(args: Array[String]):Unit = {
20 var s1 = new Student4(1,"Tom")
21 println(s1.id+"\t"+s1.name)
22 println(s1.getActionName())
23 }
24 }

包和包对象
- 包定义:可嵌套定义
- 包引入:import可写在任何地方,_代表包下的所有内容(同 java * )
- 包对象:可包含常量,变量,方法,类,对象,trait,包
[Scala] 面向对象的更多相关文章
- Spark 3000门徒第二课scala面向对象总结
昨晚听了王家林老师3000门徒spark系列课程的第二课,讲述了scala面向对象知识,并且带着过了一遍Spark核心类:SparkContent,RDD的代码,下面写一下心得: RDD是抽象类,实现 ...
- scala 面向对象之 继承
scala 面向对象之 继承 scala 1.extends Scala中,让子类继承父类,与Java一样,也是使用extends关键字 继承就代表,子类可以从父类继承父类的field和metho ...
- 6. Scala面向对象编程(基础部分)
6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...
- Scala面向对象编程与类型系统
Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...
- Scala面向对象和模式匹配
我们要封装数据,定义模板等操作,所以我们需要面向对象. 一.scala中的单例对象 在scala当中,是没有static的,scala给我们提供了单例模式的实现方法.就是使用关键字object. st ...
- Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析
/** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...
- Scala——面向对象和函数式编程语言
Scala Scala是一门运行时基于JVM的编程语言,具备函数式编程和面向对象特点. 基本知识 basics 任意词均可作为符号名,对于关键词,以反引号包裹,避免使用下划线,避免带美元符的名字. 声 ...
- 8. Scala面向对象编程(高级部分)
8.1 静态属性和静态方法 8.1.1 静态属性-提出问题 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决 8.1.2 基本介绍 -Sca ...
- 7. Scala面向对象编程(中级部分)
7.1 包 7.1.1 看一个应用场景 现在有两个程序员共同开发一个项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaohong也想定一个类也叫Dog,两个程序员还为此吵了起来,该怎么 ...
- 大数据笔记(二十四)——Scala面向对象编程实例
===================== Scala语言的面向对象编程 ======================== 一.面向对象的基本概念:把数据和操作数据的方法放到一起,作为一个整体(类 c ...
随机推荐
- 如何在O(1)时间复杂度获取栈中最大值和最小值
问题描述: 如何在O(1)时间复杂度获取栈中的最大值和最小值? 问题分析: 普通栈规定的push(入栈).pop(出栈).peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就 ...
- [树形DP]加分二叉树
加 分 二 叉 树 加分二叉树 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第j ...
- ATMS中去pause Activity A.
上文写完之后,感觉这个部分写的还是不清晰,本文继续补充一下. 首先还是看堆栈. obtain:78, PauseActivityItem (android.app.servertransaction) ...
- MySQL-索引简介
一.索引是什么? 索引是本质是一种数据结构,索引的目的在于提高查询效率.[排好序的快速查找的数据结构] 每个节点包含索引键值和一个指向对应数据记录物理地址的指针. 索引往往以索引文件的形式存储在磁盘. ...
- thinkphp添加excel更新数据表数据(优化篇)
由于主管说使用saveAll更新数据效率太低,要改用sql语句一次执行现在修改 /** * excel开启上传 * author: panzhide * @return array * Date: 2 ...
- BBR拥塞算法的简单解释
TCP BBR的ACM论文中,开篇就引入了图1,以此来说明BBR算法的切入点: 为何当前基于丢包探测的TCP拥塞控制算法还有优化空间? BBR算法的优化极限在哪儿? 图1 为了理解这张图花了我整整一个 ...
- 创建支持依赖注入、Serilog 日志和 AppSettings 的 .NET 5 控制台应用
翻译自 Mohamad Lawand 2021年3月24日的文章 <.NET 5 Console App with Dependency Injection, Serilog Logging, ...
- 闲暇时光里最好的挖矿体验——CPU挖乌龟币
我之前其实是不玩加密货币的,主要是没有钱取投资(tou ji),也没有钱去投资矿机. 不过前几天CSDN推送了一个短文,<黑客用GitHub服务器挖矿,三天跑了3万个任务,代码惊现中文> ...
- Ansible(1)- 简单介绍
什么是 Ansible 开源部署工具,也是一个自动化运维工具 开发语言:Python Ansible 的特性 模块化部署管理:调用特定的模块,完成特定任务 三个关键模块:Paramiko(python ...
- 浅谈在c#中使用Zlib压缩与解压的方法
作者:Compasslg 介绍 近期用c#开发一个游戏的存档编辑工具需要用 Zlib 标准的 Deflate 算法对数据进行解压. 在 StackOverflow 上逛了一圈,发现 c# 比较常用到的 ...