[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 ...
随机推荐
- [源码解析] 并行分布式框架 Celery 之 worker 启动 (2)
[源码解析] 并行分布式框架 Celery 之 worker 启动 (2) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (2) 0x00 摘要 0x01 前文回顾 0x2 ...
- EfficientNet & EfficientDet 论文解读
概述 总体而言,这两篇论文都在追求一件事,那就是它们名字中都有的 efficient.只是两篇文章的侧重点不一样,EfficientNet 主要时研究如何平衡模型的深度 (depth).宽度 (wid ...
- 有关指针和C语言中的常量
常量类型(五种): 字面常量(2,3,6....) ; enum 定义的枚举常量; 字符常量('a','b'....) ; ...
- “知疫”疫情防控可视化平台——NABCD分析
"知疫"疫情防控可视化平台 项目 内容 这个作业属于那个课程 2021春季学期软件工程(罗杰.任健) 这个作业的要求在哪里 初次邂逅,需求分析 1 NABCD分析 NEED 目前多 ...
- 【NCRE】常见的网络入侵与攻击的基本方法
本节内容来自<全国计算机等级考试三级教程--网络教程>2020版 实训任务五. 因为一直记不住几个常见的DOS攻击,这里记录一下,顺便找个好方法记住.跟CTF关联以后这部分知识确实感触颇深 ...
- RedHat 7.6 安装 Mysql 8.0.17
# 查看是否安装mysql rpm -qa | grep -i mysql # 如果有,需要卸载旧版本Mysql及相关依赖包 rpm -e MySQL-client-*** # 查看开机启动服务列表状 ...
- 阿里巴巴面试-Java后端-社招5面技术总结(Offer已拿)
最近接到阿里妈妈的面试通知,历经一个月,虽然过程挺坎坷,但总算是拿到了offer.这里简单记录下面试所遇问题,仅供各位大佬参考. 由于前面两面的时间过去的有点久了,只能根据记忆大概写些记得问题. 部门 ...
- python工业互联网应用实战13—基于selenium的功能测试
本章节我们再来说说测试,单元测试和功能测试.单元测试我们在数据验证章节简单提过了,本章我们进一步如何用单元测试来测试view的功能代码:同时,也涉及一下基于selenium的功能测试做法.笔者过去的项 ...
- Day05_18_类和对象的含义与关系
Java 类和对象 类的含义? 类属于引用数据类型,java语言中所有的.class都属于引用数据类型, 在类体当中,方法体之外定义的变量被称为 成员变量,成员变量若没有赋值,系统会默认赋值为0: 先 ...
- 微服务的进程间通信(IPC)
微服务的进程间通信(IPC) 目录 微服务的进程间通信(IPC) 术语 概述 通信视角 APIs 消息格式 RPC REST gRPC 断路器 API通信的健壮性 服务发现 异步消息 概念 消息 消息 ...