类定义

  • 当属性是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] 面向对象的更多相关文章

  1. Spark 3000门徒第二课scala面向对象总结

    昨晚听了王家林老师3000门徒spark系列课程的第二课,讲述了scala面向对象知识,并且带着过了一遍Spark核心类:SparkContent,RDD的代码,下面写一下心得: RDD是抽象类,实现 ...

  2. scala 面向对象之 继承

    scala 面向对象之 继承 scala   1.extends Scala中,让子类继承父类,与Java一样,也是使用extends关键字 继承就代表,子类可以从父类继承父类的field和metho ...

  3. 6. Scala面向对象编程(基础部分)

    6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...

  4. Scala面向对象编程与类型系统

    Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...

  5. Scala面向对象和模式匹配

    我们要封装数据,定义模板等操作,所以我们需要面向对象. 一.scala中的单例对象 在scala当中,是没有static的,scala给我们提供了单例模式的实现方法.就是使用关键字object. st ...

  6. Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析

    /** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...

  7. Scala——面向对象和函数式编程语言

    Scala Scala是一门运行时基于JVM的编程语言,具备函数式编程和面向对象特点. 基本知识 basics 任意词均可作为符号名,对于关键词,以反引号包裹,避免使用下划线,避免带美元符的名字. 声 ...

  8. 8. Scala面向对象编程(高级部分)

    8.1 静态属性和静态方法 8.1.1 静态属性-提出问题 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决 8.1.2 基本介绍 -Sca ...

  9. 7. Scala面向对象编程(中级部分)

    7.1 包 7.1.1 看一个应用场景 现在有两个程序员共同开发一个项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaohong也想定一个类也叫Dog,两个程序员还为此吵了起来,该怎么 ...

  10. 大数据笔记(二十四)——Scala面向对象编程实例

    ===================== Scala语言的面向对象编程 ======================== 一.面向对象的基本概念:把数据和操作数据的方法放到一起,作为一个整体(类 c ...

随机推荐

  1. FFMPEG编译问题记录

    一.ffmpeg下载与配置 下载地址 FFmpeg/FFmpeg (https://github.com/FFmpeg/FFmpeg) ~$ git clone https://github.com/ ...

  2. MongoDB中“$”操作符表达式汇总

    MongoDB中"$"操作符表达式汇总 查询 比较操作 $eq 语法:{ : { $eq: } } 释义:匹配等于(=)指定值的文档 举例: 查询age = 20的文档: db.p ...

  3. 热更新应用--热补丁Hotfix学习笔记

    一.热补丁简介 热补丁主要是用于将纯C#工程在不重做的情况下通过打补丁的形式改造成具备lua热更新功能工程,主要是让原来脚本中Start函数和Update函数等函数代码块重定向到lua代码. 二.第一 ...

  4. 如何自己设计一个类似dubbo的rpc框架?

    (1)上来你的服务就得去注册中心注册吧,你是不是得有个注册中心,保留各个服务的信息,可以用zookeeper来做,对吧 (2)然后你的消费者需要去注册中心拿对应的服务信息吧,对吧,而且每个服务可能会存 ...

  5. 黑马架构师v2.5.1 (codeUtil)使用注意事项

    资源 1.资料里的codeutil软件有问题,使用时部分类和接口文件名后有一串日期数字等.码云的没问题 2.生成代码后zookeeper的IP改为本机的

  6. ATMS中去拉起新的进程,并在新进程启动后调用attachApplication时,resume待启动的Activity

    相关文章: ATMS中去pause Activity A. 目录 ATMS拉起新进程 堆栈 resumeTopActivityInnerLocked:1684, ActivityStack start ...

  7. Python:读写文件(I/O) | 组织文件

    1. I/O 概述  程序与用户交互涉及到程序的输入输出(I/O) 一种类型是字符串,通过input() 和 print() 函数以及数据类型转换类函数如(int()),实现数据的输入输出. 另一种类 ...

  8. Django 模型(Model)

    1. 模型简介 ORM 简介 使用 Mysql 数据库的环境配置 2. 定义模型 1)定义属性 2)字段类型 3)字段选项 4)关系 5)元选项 6)范例 3. 模型成员&管理器 1)类属性 ...

  9. WSL2 Ubuntu 图形界面环境搭建(Xfce4 、XServer)

    安装wsl2和Ubuntu 在安装了wsl2后有时候需要传文件到ubuntu上面,比如传一个测试项目什么的.因为wsl里面挂载了本地的磁盘,所以准备安装个图形界面,操作下也挺简单的. 关于wsl2和U ...

  10. Property Distribution(DFS)

    Property Distribution タナカ氏が HW アールの果樹園を残して亡くなりました.果樹園は東西南北方向に H×W の区画に分けられ.区画ごとにリンゴ.カキ.ミカンが植えられています. ...