[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 ...
随机推荐
- windows一些知识
宽字节 1.什么是ASCII码? 一张存储了字母大小写与一些符号的表,用一个字节表示,最高位不使用,最多只能存储128个符号或字母,但世界上有很多种语言,这远远不够 2.什么是扩展ASCII码? 把最 ...
- Linux常用命令-基础部分
Linux介绍 Linux是一款开源的操作系统,免费,开源,安全,高效,处理高并发非常强悍,很多企业级开发项目都部署在Linux/UNIX上. 创始人:Linus Torvalds 林纳斯 Linux ...
- 【Android】修改Android Studio的SDK位置
解决SDK占用C盘空间问题 由于Android Studio默认会将环境下载到C盘,会导致C盘空间被大量占用. 对于C盘窘迫的童鞋非常不友好. 可以通过修改SDK位置的方式缓解C盘空间焦虑. 打开&q ...
- Re:从零开始的Git保姆级使用教程
观前提示: 本文主要介绍了用命令的方式对Git进行操作(全程用的win10系统),而对于TortoiseGit和github desktop等图形化操作知识,只进行简单介绍或提及,详细使用会在提到的地 ...
- SQLserver数据库安装教程
大家好,这期给大家带来一期SQL server的安装教程 下载SQL Server 2019 Developer 官方网址: https://www.microsoft.com/zh-cn/sql-s ...
- 死磕Spring之AOP篇 - 初识JDK、CGLIB两种动态代理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 京东效率专家带你快速落地DevOps
行业内的公司纷纷在招聘DevOps工程师,企业的DevOps转型看起来迫在眉睫,公司内部也要设计和开发DevOps平台,DevOps已经成为了所有IT从业人员应知应会的必备技能. 为你提供一套清晰的D ...
- Apache Hudi C位!云计算一哥AWS EMR 2020年度回顾
1. 概述 成千上万的客户在Amazon EMR上使用Apache Spark,Apache Hive,Apache HBase,Apache Flink,Apache Hudi和Presto运行大规 ...
- 如何高效的遍历Map?你常用的不一定是最快的
微信公众号:大黄奔跑 关注我,可了解更多有趣的面试相关问题. 写在之前 如文章标题所言,遍历Map是开发过程中比较常见的行为,实现的方式也有多种方式,本文带领大家一起看看更加高效的遍历 Map. 『茴 ...
- 【MySQL】实现线上千万数据表添加字段操作以及缓存刷新
需求背景: 由于业务需求,需要在线上用户表添加渠道字段,用于区分不同渠道注册的用户,目前该表有20+个字段,8个索引 线上用户数据大概1500W左右,需要不停机增加数据库字段,同时需要刷新Redis缓 ...