博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala入门与进阶(四)- Scala面向对象
阅读量:6554 次
发布时间:2019-06-24

本文共 3231 字,大约阅读时间需要 10 分钟。

4. Scala面向对象

1.面向对象概述

  • 封装:属性方法封装到类中

  • 继承:父类和子类直接的关系

  • 多态:***** 父类引用指向子类对象 精髓所在,开发框架的基石

2.类的定义和使用

package com.gwf.scala.course04object SimpleObjectApp {def main(args: Array[String]): Unit = {val person = new People()person.name = "Messi"println(person.name+" "+person.age)println("invoke eat method "+person.eat)person.watchFootball("Barcelona")person.printInfo()}class People{var name:String = _ //_代表占位符val age = 10// 私有变量,外部不能访问,[]里的this代表访问权限,可以填当前所在包,则包内可以访问private [this] var gender:String = "male"def printInfo(): Unit ={println(gender)}def eat():String={name + "eat ....."}def watchFootball(teamName: String)={println(name+"is watching match of "+teamName)}}}复制代码
scala> var d:Double = _d: Double = 0.0scala> val i:Int = _
:11: error: unbound placeholder parameterval i:Int = _^scala> var i:Int = _i: Int = 0scala> var s:String = _s: String = nullscala>复制代码

3.主构造器和附属构造器

// 主构造器,如果不加val/var修饰符则默认是private[this] val 类型class Person(val name:String,val age:Int,other:String){println("Person Constructor enter...")val school = "ustc"var gender:String = _def getOther(): String = otherdef this(name:String,age:Int,other:String,gender:String){this(name,age,other) // 附属构造器的第一行必须调用主构造器或者其他构造器this.gender = gender}println("Person Constructor leave...")}复制代码

4.继承

// 子类继承父类,父类的属性在子类构造函数中可以不加val/var声明,子类特有的属性必须要加,否则也会变成private[this] valclass Student(name:String,age:Int,other:String,val school:String) extends Person(name,age,other){}复制代码

5.重写

class Student(name:String,age:Int,other:String,val school:String) extends Person(name,age,other){// 重写必须加overrideoverride val country: String = "USA"// $代表thisoverride def toString = s"Student($country, $school)"}复制代码

6.抽象类

/*** 类的一个或者多个方法没有完整的实现(只有定义,没有实现)*/abstract class Person2{def speakvar name:Stringvar age:Int}/*** 普通了继承抽象类要实现未实现的抽象方法和抽象属性*/class Student2 extends Person2{override def speak: Unit = println("speak")override var name: String = _override var age: Int = _}复制代码

7.伴生类和伴生对象

/*** 如果有一个class,还有一个与class同名的object* 那么就称称这个个object是class的伴生対象, class是object的伴生类,两者相辅相成*/class ApplyTest{}object ApplyTest{}复制代码

8.Apply 方法

package com.gwf.scala.course04object ApplyApp {def main(args: Array[String]): Unit = {for(i <- 1 to 10){ApplyTest.incr}println("count:"+ApplyTest.count) // 10 说明object本身就是一个单例对象println("~~~~~~~~~~~~~")val b = ApplyTest() // ==>Object.println("~~~~~~~~~~~~~")val c = new ApplyTest()println(c)c() // ==>Class.// 类名() ===> Object.apply// 对象() ===> Class.apply}}/*** 如果有一个class,还有一个与class同名的object* 那么就称称这个个object是class的伴生対象, class是object的伴生类,两者相辅相成*/class ApplyTest{def apply()= {println("Class ApplyTest apply...")}}object ApplyTest{println("Object ApplyTest enter...")var count = 0def incr = {count = count + 1}// 最佳实践:在0bject的apply方法中去new Classdef apply()= {println("Object ApplyTest apply...")}println("Object ApplyTest leave...")}复制代码

9.case class

package com.gwf.scala.course04// 通常用到模式匹配里object CaseClassApp {def main(args: Array[String]): Unit = {println(Dog("wangcai").name)}}case class Dog(name:String)复制代码

10.Trait

Trait 类似于java的接口,但是可以集成抽象类,并实现其抽象方法。

// Triat多集成:XXX extends ATrait with BTraitclass SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable {复制代码

转载于:https://juejin.im/post/5c3af83c6fb9a04a0e2d6d11

你可能感兴趣的文章
Hibernate 自动生成数据库表
查看>>
phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合
查看>>
牛客网Java刷题知识点之构造函数是什么、一般函数和构造函数什么区别呢、构造函数的重载、构造函数的内存图解...
查看>>
博客更名为 健哥的数据花园
查看>>
linux 批量进行:解压缩某一类压缩文件类型的文件
查看>>
ubuntu,CentOS永久修改主机名
查看>>
激活modelsim se 10.4 时运行patch_dll.bat不能生成TXT
查看>>
17秋 软件工程 Alpha 事后诸葛亮会议
查看>>
线性空间
查看>>
Tensflow的targmax函数
查看>>
疑似checkpoint堵塞数据库连接
查看>>
Node.js中针对中文的查找和替换无效的解决方法
查看>>
理解指针的关键
查看>>
如何查看Ubuntu下已安装包版本号
查看>>
MS SQL巡检系列——检查重复索引
查看>>
我的那些年(2)~我毕业了
查看>>
VS2017 配置ImageMagick
查看>>
scrapy 直接在编辑器运行
查看>>
微信小程序Tab选项卡切换大集合
查看>>
Hive任务优化--控制hive任务中的map数和reduce数
查看>>