[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 ...
随机推荐
- FFMPEG编译问题记录
一.ffmpeg下载与配置 下载地址 FFmpeg/FFmpeg (https://github.com/FFmpeg/FFmpeg) ~$ git clone https://github.com/ ...
- MongoDB中“$”操作符表达式汇总
MongoDB中"$"操作符表达式汇总 查询 比较操作 $eq 语法:{ : { $eq: } } 释义:匹配等于(=)指定值的文档 举例: 查询age = 20的文档: db.p ...
- 热更新应用--热补丁Hotfix学习笔记
一.热补丁简介 热补丁主要是用于将纯C#工程在不重做的情况下通过打补丁的形式改造成具备lua热更新功能工程,主要是让原来脚本中Start函数和Update函数等函数代码块重定向到lua代码. 二.第一 ...
- 如何自己设计一个类似dubbo的rpc框架?
(1)上来你的服务就得去注册中心注册吧,你是不是得有个注册中心,保留各个服务的信息,可以用zookeeper来做,对吧 (2)然后你的消费者需要去注册中心拿对应的服务信息吧,对吧,而且每个服务可能会存 ...
- 黑马架构师v2.5.1 (codeUtil)使用注意事项
资源 1.资料里的codeutil软件有问题,使用时部分类和接口文件名后有一串日期数字等.码云的没问题 2.生成代码后zookeeper的IP改为本机的
- ATMS中去拉起新的进程,并在新进程启动后调用attachApplication时,resume待启动的Activity
相关文章: ATMS中去pause Activity A. 目录 ATMS拉起新进程 堆栈 resumeTopActivityInnerLocked:1684, ActivityStack start ...
- Python:读写文件(I/O) | 组织文件
1. I/O 概述 程序与用户交互涉及到程序的输入输出(I/O) 一种类型是字符串,通过input() 和 print() 函数以及数据类型转换类函数如(int()),实现数据的输入输出. 另一种类 ...
- Django 模型(Model)
1. 模型简介 ORM 简介 使用 Mysql 数据库的环境配置 2. 定义模型 1)定义属性 2)字段类型 3)字段选项 4)关系 5)元选项 6)范例 3. 模型成员&管理器 1)类属性 ...
- WSL2 Ubuntu 图形界面环境搭建(Xfce4 、XServer)
安装wsl2和Ubuntu 在安装了wsl2后有时候需要传文件到ubuntu上面,比如传一个测试项目什么的.因为wsl里面挂载了本地的磁盘,所以准备安装个图形界面,操作下也挺简单的. 关于wsl2和U ...
- Property Distribution(DFS)
Property Distribution タナカ氏が HW アールの果樹園を残して亡くなりました.果樹園は東西南北方向に H×W の区画に分けられ.区画ごとにリンゴ.カキ.ミカンが植えられています. ...