Scala面向对象
面向对象编程OOP:
Scala vs Java 都有这三特性
封装:把属性、方法封装到类中
Person:
int id, String name, Date birthday.... 需要getter/setter
eat、sleep....
继承:父类和子类之间的关系 override重写
User extends Person
exam...... //即可以继承别的类,也可以有自己的属性
多态:*****级别,父类引用指向子类对象 精髓所在 开发框架的基石。
Person person = new Person();
User user = new User();
Person person = new User();
类的定义和使用:
object SimpleObjectApp {
def main(args: Array[String]): Unit = {
val perosn = new People();
person.name = "Messi"
println(person.name + " .. " + person.age)
person.printInfo()
}
}
定义一个类:
class People {
//定义属性
var name:String = ""
val age:Int = 10
private [this] val gender = "male" //private 表示只在本类里生效,出了本类就失败。
def printInfo(): Unit = {
println("gender:" + gender)
}
//定义方法
def eat():String = {
name + "eat..."
}
def watchFootball(teamName: String): Unit = {
println(name + "is watching match of " + teamName)
}
}
构造器:
object ConstructorApp {
def main(args: Array[String]): Unit = {
val person = new Person("zhangsan", 30)
println(person.name + " : " + person.age + " : " + "person.school")
val person2 = new Person("lisi", 18, "M")
println(person2.name + " : " + person2.age + " : " + "person2.school" + " : " + person2.gender)
}
}
// 主构造器 (val name:String, val age:Int)
class Person(val name:String, val age:Int) {
println("Person Constructor enter...." )
val school = "ustc"
var gender:String = _
//附属构造器
def this(name:String, age:Int, gender:String) {
this(name,age) //附属构造器的第一行代码必须要调用主构造器或者其他附属构造器
this.gender = gender
}
println("Person Constructor leave...." )
}
继承:
object ConstructorApp {
def main(args: Array[String]): Unit = {
val student = new Student("xiaochun", 18, "Math")
println(student.name + " : " + student.gender)
}
}
class Student(name:String, age:Int, var major:String) extends Person(name,age) { //extends 关键字,继承。
println("Person Student enter...." )
println("Person Student leave...." )
}


注意:当我们子类去继承父类的时候,如果父类有的属性,子类不用写val或var。例如上面的name:String和age:Int。 但是major:String参数是父类里没有的,所以必须写var或val。
重写:
使用override可以对子类继承父类的属性或者方法改写的。
比如修改上面的学校名:必须加override关键字
override val school = "peking"
override def toString: String = "Person: override def toString :" + school
抽象类:
如果在父类中,有某些方法无法立即实现,而需要依赖不同的子类来覆盖,重写实现不同的方法。
此时,可以将父类中的这些方法编写成只含有方法签名,不含方法体的形式,这种形式就叫做抽象方法。
一个类中,如果含有一个抽象方法或抽象field,就必须使用abstract将类声明为抽象类,该类是不可以被实例化的;在子类中覆盖抽象类的抽象方法时,可以不加override关键字。
object AbstractApp {
def main(args: Array[String]): Unit = {
val student = new Student2()
println(student.name)
student.speak
}
}
/**
* 类的一个或者多个方法没有完整的实现 (只有定义,没有实现)
*/
//抽象类
abstract class Person2 {
//抽象方法
def speak
//抽象字段
val names:String
val age:Int
}
//抽象类实现类
class Student2 extends Person2 {
override def speak: Unit = {
println("speak")
}
override val name: String = "xiaochun"
override val age: Int = 18
}
伴生类和伴生对象:
object ApplyApp {
}
//伴生类和伴生对象: class ApplyTest是object ApplyTest的伴生类,反之object ApplyTest是 class ApplyTest的伴生对象。两个是同名的。
class ApplyTest{
}
object ApplyTest{
}
apply方法:
object ApplyApp {
def main(args: Array[String]): Unit = {
for(i <- 1 to 10) {
ApplyTest.incr
}
println(ApplyTest.count) //10 说明object本身就是一个单例对象
var b = ApplyTest() // ==> 这句话调用的是Object里的apply方法
println("~~~~~~~~")
var c = new ApplyTest() // ==> 这句话调用的是class里的apply方法
println(c)
c()
//类名() ==> Object.apply
//对象() ==> Class.apply
}
}
class ApplyTest{
def apply() = {
println("class ApplyTest apply....")
}
}
object ApplyTest{
println("Object ApplyTest enter....")
var count = 0
def incr = {
count = count + 1
}
//最佳实践: 在Object的apply方法中去new Class
def apply() = {
println("Object ApplyTest apply....")
//在object中的apply中new class
new ApplyTest
}
println("Object ApplyTest leave....")
}
case class:
//通常用在模式匹配里面
object CaseClassApp {
def main(args: Array[String]): Unit = {
println(Dog("wangcai").name)
}
}
//case class 不用new,直接使用就行。
case class Dog(name:String)
trait: xxx extends Atrait with BTrait
class SparkConf(loadDefaults: Boolean)
extends Cloneable
with Logging
with Serializable
...
...
//这两个with的东西都是用 trait Logging和 trait Serializable
trait Partition extends Serializable {
def index: Int
override def hashCode(): Int = index
override def equals(other: Any): Boolean = super.equals(other)
}
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 ...
随机推荐
- tf.clip_by_global_norm
首先明白这个事干嘛的,在我们做求导的时候,会遇到一种情况,求导函数突然变得特别陡峭,是不是意味着下一步的进行会远远高于正常值,这个函数的意义在于,在突然变得陡峭的求导函数中,加上一些判定,如果过于陡峭 ...
- C6678芯片
TMS320C6678是一款八核C66x的定点/浮点DSP,支持高性能信号处理应用.TMS320C6678芯片是美国德州仪器公司生产的处理器.它支持高性能信号处理应用,支持DMA传输,可应用于高端图像 ...
- Linux基础之输入输出
第十五章 输入输出 一.重定向概述 1.1.什么是重定向? 将原本要输出到屏幕的数据信息,重新定向到指定的文件中. 比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中.这样第二天通过查看 ...
- [python 学习] random
1.random() 生成一个随机浮点数 import random # x 属于 [0,1) x = random.random() print x 2.uniform() 生成制定范围内的随机浮点 ...
- 理解Promise (4)
then 方法必须 返回一个新的promise promise2 = promise1.then(onFulfilled, onRejected); 新的Promise 必须返回传递两个方法 onF ...
- JavaWeb(四):JDBC
数据持久化(persistence) 把数据保存到可掉电式存储设备中以供之后使用. 大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各 ...
- Change the environment variable for python code running
python程序运行中改变环境变量: Trying to change the way the loader works for a running Python is very tricky; pr ...
- 继续写高精!noip2012国王游戏。。。
国王游戏 题目描述: 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- Mac终端的Cocoapods创建自己的私有库和公有库
一,前言 为什么要用Cocopods 通常在开发的过程中,大多时候,我们会处理一类相同的操作,比如对于字符串String的邮箱验证,是否为空,手机号验证,或者一些UIView的动画操作,我们为了避免写 ...
- 20180805-Java ByteArrayOutputStream类
下面的例子演示了ByteArrayInputStream 和 ByteArrayOutputStream的使用: import java.io.* public class ByteStreamTes ...