Scala基本语法-面向对象
文章目录
- 1、类
- 2、 构造器
- 3、继承
- 4、伴生类,伴生对象
- 5、解读apply方法
- 6、 抽象类
- 7、多态
- 8、特质Trait
1、类
定义一个类,里面带有属性和函数
class People{var name=""// val name:String=_ //下划线表示占位符// val a.Int=_var city=""//定义一个私有属性private[this] val gender="male"def sleep()={name+"ZZzzzzz"}def py(pyName:String):Unit={println(name+"正在和"+pyName+"xxxxxxxx")}
}main
val p=new People()
p.name="zhangsan"
println(p.sleep())
p.py("lisi")输出:
zhangsanZZzzzzz
zhangsan正在和lisixxxxxxxx
不同数据类型的占位符默认值
* scala> var a:String = _* a: String = null* * scala> var b:Boolean = _* b: Boolean = false* * scala> var c:Int = _* c: Int = 0* * scala> var d:Double = _* d: Double = 0.0
2、 构造器
- 在Scala中,不需要像Java一样需要在类中定义一个与类名相同的方法来当作构造器。
主构造器的参数列表写在类名的后面,而构造器的内容,则直接写在类定义里面,所以说,一个Scala类里面,除了方法和字段的定义以外的代码,全都是主构造器的内容。
- 在scala中,如果不指定主构造函数,编译器将创建一个主构造函数的构造函数。 所有类的主体的声明都被视为构造函数的一部分。它也被称为默认构造函数。
- 主构造器是直接定义在类名后面,主构造器中的参数最终会被编译成字段/属性
- 构造方法中参数不加var class Person(name: String, age: Int) 那么name age为私有的,则会声明为private[this]修饰
- 主构造器会执行类定义中的所有语句。如下,println语句是主构造器的一部分,当类被实例化时,println语句会立即执行。
- 构造器中如果定义了方法,那么会编译其方法,当类实例化时不会执行,只有当调用该方法的时候才执行。
- 附属构造器
- 语法: def this(…)
- 第一行代码:必须要调用已经存在的主构造器或者其他附属构造器
- Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载
- 辅助constructor之间可以互相调用,而且必须第一行调用主constructor
- 每个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始。
//主构造器只需要在类名后面带上参数即可
class Student(var name:String,var age:Int) {println("Student constructor enter...")//在主构造器中定义一个gender属性var gender: String = _//在构造器中定义一个方法def printInfo(): Unit = {println("printInfo invoked....")}// * 附属构造器
// * 语法: def this(......)
// * 第一行代码:必须要调用已经存在的主构造器或者其他附属构造器def this(name:String,age:Int,gender:String){this(name,age)this.gender=gender}val school = "ustc"println("Student constructor leave...")}object ScalaYi {def main(args: Array[String]): Unit = {val student1=new Student("zhangan",18)print(student1.name+" "+student1.age+" "+student1.gender+" "+student1.school)val student2=new Student("lisi",20,"male")println(student2.gender)}
}输出:
Student constructor enter...
Student constructor leave...
zhangan 18 null ustcStudent constructor enter...
Student constructor leave...
male
3、继承
- Scala中,让子类继承父类,与Java一样,也是使用extends关键字
- 继承:子类可以从父类继承父类的属性和方法;然后子类可以在自己内部放入父类所没有的属性和方法
- 子类可以覆盖父类的**属性(val)**和方法;但是如果父类用final修饰,则该类是无法被继承的;如果父类中属性或者方法使用final修饰,不能被重写
- 重写一个非抽象方法或者属性时必须使用override修饰符; 在子类中重写超类的抽象方法时,你不需要使用override关键字
class Animal {//属性val name:String = "name"val color:String = "color"final var str1:String="private String1"//方法def eat():Unit={println(color+"的"+name+"在吃东西")}//父类特有的方法,不能被重写final def printInfo():Unit={println("我是父类...")}
}class Dog extends Animal{//子类可以覆盖父类的val fieldoverride val name:String="哈皮狗"override val color:String="白色"override def eat(): Unit = super.eat()
}object ScalaYi {def main(args: Array[String]): Unit = {val dog =new Dog//str1使用final修饰,不能使用//dog.str1dog.printInfo()dog.eat()}
}
子类构造方法触发之前要先触发其父类的构造方法
代码执行顺序
class Animal(var name:String,var age:Int){println("Animal constructor enter...")//方法def eat():Unit={println(name+"在吃东西")}//父类特有的方法,不能被重写final def printInfo():Unit={println("我是父类...")}println("Animal constructor leave...")
}class Dog(name:String,age:Int,var color:String) extends Animal(name,age){println(s"$name constructor enter...")override def eat(): Unit = {println(s"""|my name is $name|I am $age years old|my color is $color""".stripMargin)}println(s"$name constructor leave...")
}object ScalaYi{def main(args: Array[String]): Unit = {//创建dog实例对象var dog = new Dog("哮天犬",18,"黑色")//调用重写的eat方法dog.eat()//调用父类的特有方法dog.printInfo()}
}输出:
Animal constructor enter...
Animal constructor leave...
哮天犬 constructor enter...
哮天犬 constructor leave...my name is 哮天犬
I am 18 years old
my color is 黑色我是父类...
4、伴生类,伴生对象
- 在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。
- Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。
- 如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
- 伴生类和伴生对象必须存放在一个.scala文件之中
- 伴生类和伴生对象,最大的特点就在于,互相可以访问private field
//伴生类
class Work(var name:String,var address: String) {//半生类中的私有属性private var phone="110"//访问伴生对象中的私有属性def classWork() = println("伴生类中访问伴生对象的私有属性:" + Work.id)//伴生类中的test方法def test(): Unit ={println("class test")}
}//伴生对象
object Work{//伴生类中的私有属性private var id:String="01"var count:Int=1//add方法def add()={count += 1 //加1count //返回sno}//半生对象中的static方法def static(): Unit ={println("object static....")}
}object ScalaYi{def main(args: Array[String]): Unit = {/**伴生对象(object)中访问属性或者方法时直接用该对象调用即可,不需要new实例*伴生类(class)需要new实例进行访问*///伴生对象中的static方法,直接使用Work.方法名Work.static()//演示单例模式for (i<- 1 to 10){Work.add()}//查看打印的结果证明是不是单利模式,如果是结果是11,不是结果为每一个对象加1println("我是单利模式吗:"+Work.count)//半生对象,需要newvar a = new Work("学生","家里蹲")a.test()//访问私有属性a.classWork()}
}输出结果:
object static....
我是单利模式吗:11
class test
伴生类中访问伴生对象的私有属性:01
5、解读apply方法
- object中非常重要的一个特殊方法,就是apply方法
- 通常在伴生对象中实现apply方法,并在其中实现构造伴生类的对象的功能
- 而创建伴生类的对象时,通常不会使用new Class的方式,而是使用Class()的方式,隐式地调用伴生对象得apply方法,这样会让对象创建更加简洁。
//伴生类
class Work(var name:String,var address: String) {//伴生类中的test方法def test(): Unit ={println("class test")}def apply() = {println("class apply.....")}
}//伴生对象
object Work{//半生对象中的static方法def static(): Unit ={println("object static....")}//实现apply方法,实例化伴生类def apply(name: String,address: String)={println("object apply.....")new Work(name,address)}
}object ScalaYi{def main(args: Array[String]): Unit = {/**伴生对象(object)中访问属性或者方法时直接用该对象调用即可,不需要new实例*伴生类(class)需要new实例进行访问,但是如果伴生对象中实现apply方法也不需要new*///伴生类中的static方法,直接使用Work.方法名Work.static()//实际是通过伴生对象中的apply方法进行了对象实例化,避免了手动new对象// 伴生对象() ==> 调用的是伴生对象的apply的方法val a=Work("程序猿","家里蹲")//调用伴生类中的test方法a.test()println(a.name+" "+a.address)//实例化伴生类val b=new Work("架构师","阿里")//调用伴生类中的test方法b.test()b()/**** 类名() ==> object apply ( val a=Work("程序猿","家里蹲"))* new出来的对象() ==> class apply (b())*/}
}结果:
object static....
object apply.....
class test
程序猿 家里蹲
class test
class apply.....
6、 抽象类
- 如果在父类中,有某些方法无法立即实现,而需要依赖不同的子来来覆盖,重写实现自己不同的方法实现。此时可以将父类中的这些方法不给出具体的实现,只有方法签名,这种方法就是抽象方法。
- 而一个类中如果有一个抽象方法,那么类就必须用abstract来声明为抽象类,此时抽象类是不可以实例化的
- 在子类中覆盖抽象类的抽象方法时,不需要使用override关键字
abstract class Person2 {def speakval name:Stringvar age:Int
}class Student2 extends Person2 {def speak(): Unit ={println("Student2 speak.....")}val name = "zhangsan"var age = 18
}object ScalaYi {def main(args: Array[String]): Unit = {val s = new Student2()s.speak()println(s.name + " : " + s.age)}
}结果:
Student2 speak.....
zhangsan : 18
7、多态
父类引用指向子类对象
//抽象Person类
abstract class Person(var name:String,var age:Int){def walk():Unit//talkTo方法,参数为Person类型def talkTo(p:Person):Unit
}class Student(name:String,age:Int) extends Person(name,age){private var studentNo:Int=0def walk()=println("walk like a elegant swan")//重写父类的talkTo方法def talkTo(p:Person)={println("talkTo() method in Student")println(this.name+" is talking to "+p.name)}
}class Teacher(name:String,age:Int) extends Person(name,age){private var teacherNo:Int=0def walk()=println("walk like a elegant swan")//重写父类的talkTo方法def talkTo(p:Person)={println("talkTo() method in Teacher")println(this.name+" is talking to "+p.name)}
}object ScalaYi{def main(args: Array[String]): Unit = {//下面的两行代码演示了多态的使用//Person类的引用可以指向Person类的任何子类val p1:Person=new Teacher("albert",38)val p2:Person=new Student("john",38)//下面的两行代码演示了动态绑定//talkTo方法参数类型为Person类型//p1.talkTo(p2)传入的实际类型是Student//p2.talkTo(p1)传入的实际类型是Teacher//程序会根据实际类型调用对应的不同子类中的talkTo()方法p1.talkTo(p2)p2.talkTo(p1)}
}结果:
talkTo() method in Teacher
albert is talking to john
talkTo() method in Student
john is talking to albert
8、特质Trait
trait 和interface接口类似
trait C{def c()
}
class D extends A with C{}
A:可以是父类,也可以是trait,C只能是trait
Scala基本语法-面向对象相关推荐
- Scala教程之:面向对象的scala
文章目录 面向对象的scala Unified Types Classes Traits 面向对象的scala 我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala ...
- Scala基础语法学习
目录 一.变量 二.数据类型 三.scala中的条件表达式 四.循环 五.while循环 六.方法 6.函数 7.数组 (1).定长数组 (2).变长数组 (3).遍历数组 (4).数组常用操作 8. ...
- 【Scala】Scala的语法
Scala的语法 Scala概述 概述 编程范式 基本输出类型和变量 输出输入 控制结构 数据结构 数组(Array) 元组(Tuple) 容器(Collection) 序列(Sequence) ra ...
- 第四课 尚硅谷Scala语言学习-面向对象
第四课 尚硅谷Scala语言学习-面向对象 文章目录 第四课 尚硅谷Scala语言学习-面向对象 第一节 Scala 包 1.1 包基本语法 1.2 包说明 1.3 包对象 1.4 导包说明 第二节 ...
- 图解 Scala 基本语法 V2018.12.17
2019独角兽企业重金招聘Python工程师标准>>> 在线运行地址:图解 Scala 基本语法代码片段 转载于:https://my.oschina.net/joymufeng/b ...
- scala函数式编程(二) scala基础语法介绍
上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容. 这里会先重点介绍scala的一些语法.当然,这里是假设你有一些ja ...
- 【博学谷学习记录】超强总结,用心分享丨大数据超神之路(一):Scala基础语法副本
大数据开发基础 学习编程语言往往是我们开启学习之路的第一大步.大数据领域的很多框架都是基于Java语言开发的,而且各种框架也都提供了Java API来提供使用和操作接口,所以Java语言的学习逃 ...
- Spark记录-Scala基础语法
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...
- JAVA基础语法——面向对象思想
Java基础语法 前言 一.面向对象思想 1.面向对象(OOP)概述 2.面向对象三大特性五大原则 二.类和对象 1.对象和类的概念 2.对象的特征 3.构造方法 3.This关键字 4.static ...
- java面向对象基础代码_Java基础语法——面向对象(1)
一 面向对象 1.1 什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考"我该怎么做",然后一步步实 ...
最新文章
- js中document.write的那点事
- python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏
- 将图片资源文件整合到DLL文件中
- Tensorflow【实战Google深度学习框架】—使用 TensorFlow 实现模型
- ITK:遮盖一张图像给定标签图
- 几个预编译指令的用法
- 一个好用的 SAP UI5 本地打包(build)工具,自动生成Component-preload.js
- 好心帮男朋友洗衣服,他却要分手??
- BHO插件操作IE浏览器,js调用C#方法
- Windows平台RTMP推送摄像头对接介绍
- 在matlab中进行遥感影像地理坐标的相互转换
- LeetCode11 盛最多水的容器
- go技术文章精选(2019)
- java pdf合并_利用iText 合并PDF与分解PDF的例子
- 第四章 选择结构程序设计习题总结
- 中文句法分析_句法分析StanfordParser+依存句法分析pyhanlp
- Django实现adminx后台网站访问的IP记录统计
- Android开发之自定义圆角矩形图片ImageView
- IDEA: 全局搜索 、全局查找
- skynet 游戏服务器探索(1)--熟悉skynet(网络)