Scala基础知识笔记2
1 类
1.1 定义一个简单的类
1.2 field的getter 和 setter方法
感觉成员变量定义成 var 属性名=属性值即可, 不需要定义成 val 或者 private就行,
// ---------------------- 自定义类 和 属性 get set方法-------------------------------------------------
/* class HelloWorld {
var name="zm" // 自动生成get set方法, 如果属性是private 那么生成的get set方法也是private
val age = 32 // val类型的成员变量只提供get方法 不提供set方法 比如调用 对象.age=34会报错
def sayHello(name:String) {
println("hi: " + name)
}
def getName = name
} val hello = new HelloWorld
//println(hello.getName) // 如果定义的方法没有括号 那么调用时也不能带括号
//println(hello.sayHello("ping"))
//println(hello.name) get方法获取属性值
//hello.name="ping" set方法设置属性值
// println(hello.name)
println(hello.age)
// hello.age=34 // 编译报错
//hello.love
*/
// 自定义 属性的 get set方法 Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式
/*class Man{
private var myname = "zm"
def name = "you name is" + myname // get方法
def name_=(value:String) { // 自定义 private类型的属性的 set方法 其中 _=固定写法并且前后不能有空格
print("you cannot edit your name!!!")
}
} /* val man = new Man
println(man.name) // 调用属性 get方法
man.name="liang" // 调用属性 set方法 */ // 属性是private类型的成员变量 自定义 set方法来修改属性值
class Man{
private var myname = "zm"
def name = "you name is" + myname // get方法
def updateName(value:String) { // 自定义 private类型的属性的set方法
myname = value
}
} val man = new Man
println(man.name)
man.updateName("liang")
println(man.name)*/ // 生成java风格的 get set方法 感觉没必要
/*import scala.reflect.BeanProperty
class Student{
@BeanProperty var name:String =_
class Student(@BeanProperty var name: String)
}
val s = new Student
s.setName("leo")
println(s.getName())*/
1.3 constructor介绍
1.4 内部类介绍
// 辅助构造函数 类似 java的构造器
/* class Person{
var name = ""
var age = 0
def this(name:String) {
this()
this.name = name
} def this(name:String, age:Int) {
this(name:String)
this.age = age
}
} var person = new Person("zm",34)
println(person.name)
println(person.age)*/ // 主构造函数 就是在类名括号里定义 构造函数需要的形参的写法
/* class Person(val name: String, val age: Int) {
println(name + " | " + age)
}
var person = new Person("zm",32)*/ // 内部类
import scala.collection.mutable.ArrayBuffer
class Class {
class Student(val name: String) {}
val students = new ArrayBuffer[Student]
def getStudent(name: String) = { // 理解为新生报到
new Student(name)
}
} val c1 = new Class
val s1 = c1.getStudent("leo")
c1.students += s1
1.5 object 静态类-继承-枚举-object的apply方法
// object 相当于静态类 存放静态field 和 method 工具方法 不能定义接受参数的constructor
// object内部不在method内的代码就是 object的constructor object的constructor只会在其第一次调用时执行一次
/* object Person{
private var eyes = 2
println("this is object Person consutror")
def getEyes = eyes
}
println(Person.getEyes)*/ // 伴生类和伴生对象 class类和class同名的object对象并定义在同一个 .scala文件中,那么彼此是对方的伴生类好伴生对象
// 特点是互相可以访问对方的private field属性
/* object Person {
private val eyeNum = 2
def getEyeNum = eyeNum
} class Person(name:String="zm", age:Int=32) {
def sayHello = println(name + " | " + age + " have " + Person.getEyeNum + " eyes") // 使用伴生类的私有属性
} val person = new Person
person.sayHello*/ // objectjic 继承 抽象类
/* abstract class Hello(var name:String="zm", var age:Int=32) {
def sayHello(name:String):Unit
} object Person extends Hello("zm",34) {
override def sayHello(name: String) {
println("hello " + name )
}
}
Person.sayHello("liang")*/ // object的重要方法 apply
// 通常在伴生对象中实现apply方法,并实现构造伴生类的对象的功能,而且创建时通常不使用new Class的方式,使用Class()的方式
// 隐士调用伴生对象的apply方法, 让代码更简洁 eg: val a = Array(1,2,3) Array类的伴生对象的apply方法就实现了接收可变数量的参数,并创建一个Array对象的功能
// 自定义 伴生类和伴生对象和 apply
/* class Person(var name:String){ }
object Person {
def apply(name:String): Unit = {
new Person(name)
}
}*/
// 必须定义在 object的main函数写法
/* object HelloWorld {
def main (args: Array[String]){
println("hello world")
}
}*/
// scalac xx.scala scala xxx 编译和运行 // 使用object实现枚举
// Scala没有直接提供类似于Java中的Enum这样的枚举特性,需要用object继承Enumeration类,并且调用Value方法来初始化枚举值
/* object Season extends Enumeration {
val SPRING = Value(0, "spring") // 索引位置 索引值
val SUMMER = Value(1, "summer")
val AUTUMN = Value(2, "autumn")
val WINTER = Value(3, "winter")
}
println(Season(0)) // 得到 spring这个value的值
println(Season.withName("spring")) // 得到 spring
//for (ele <- Season.values) println(ele)
for(c<-Season.values) println(c)*/
继承之 override super isInstanceof asInstanceof 模式匹配判断对象类型
// 继承中 子类覆盖父类方法 必须使用 override 子类调用父类被覆盖的方法使用 super 关键字
/* class Person {
private var name = "leo"
val age = 32
def getName = name
}
class Student extends Person {
private var score = "A"
override val age = 34 // 子类可以覆盖父类 val的变量
def getScore = score
override def getName = "Hi, I'm " + super.getName
}*/ // 父类对象 指向了子类实例, 然后父类对象又想转换为子类 如果对象是null,则isInstanceOf一定返回false,asInstanceOf一定返回null
/* c
var p:Person = new Student
if(p.isInstanceOf[Student]) { // 如果是子类类型
//println("p is student")
var s:Student = p.asInstanceOf[Student] // 那么强转成子类类型 println( p.getClass ) // class com.beijing.App$Student 得到类实例的真实类信息
println( classOf[Person] ) // class com.beijing.App$Person*/ // 使用模式匹配 判断对象类型
/* class Person
class Student extends Person
val p:Person = new Student p match {
case one:Person => println("i am the Person type")
case _ => println("i am unknown type")
}*/
继承之子类父类构造函数
// 子类调用父类的constructor 1 每个类可以有一个主constructor 和任意多个辅助constructor, 而每个辅助constructor第一行
// 都必须是调用主constructor或者其他辅助constructor, 也就是子类的辅助构造函数第一行是一定不可能调用主类的构造函数的
// 2 只能在子类的主构造函数中调用父类的构造函数, 如果是父类中接收的参数,比如name和age,子类中接收时,就不要用任何val或var来修饰了,否则会认为是子类要覆盖父类的field
/* class Person(name:String, age:Int)
class Student(name:String, age:Int, var sex:Int) extends Person(name, age) { def this(name:String) {// 辅助构造函数调用主构造函数
this(name,0,0)
} def this(age:Int,name:String) {// 第一行 调用其他辅助构造函数
this(name)
} }*/
继承之 匿名内部类 抽象类
// 匿名内部类 定义没有名称的子类并直接创建对象,将创建的对象赋予一个变量, 以及可以将该对象传递给其他函数
/* class Person(val name:String) { // 定义原始类
def sayHello = "hello, i am " + name
} val p = new Person("zm") { // 匿名内部类需要覆盖主类的方法 因为匿名内部类相当于主类的子类
override def sayHello = "hello, i am" + name
} def greeting(p:Person) { // 普通传参
println(p.sayHello)
} def greeting1(p:Person{def sayHello:String}) { // 普通传参
println(p.sayHello)
} greeting1(p)*/ // 抽象类 抽象方法 抽象属性 子类在继承过来之后 这些类方法属性都不需要override
Scala基础知识笔记2的更多相关文章
- Scala基础知识笔记1
上一篇文章介绍了如何下载scala, 因为在官网上点击下载按钮无法下载, 下面介绍scala的基础语法: 1 scala和java的关系 Scala是基于jvm的一门编程语言,Scala的代码最终会经 ...
- JS基础知识笔记
2020-04-15 JS基础知识笔记 // new Boolean()传入的值与if判断一样 var test=new Boolean(); console.log(test); // false ...
- Java多线程基础知识笔记(持续更新)
多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...
- javascript基础知识笔记-自用
笔记内容根据个人基础知识不足不明白之处做的记录.主要看的:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 1.变量,变量的名字又叫标识符 ...
- Mysql之基础知识笔记
Mysql数据库基础知识个人笔记 连接本地数据库: mysql -h localhost -u root -p 回车输入数据库密码 数据库的基础操作: 查看当前所有的数据库:show database ...
- java基础知识-笔记整理
1.查看已安装jdk文件路径 CMD输入java -verbose. 2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...
- scala 基础知识总结
在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...
- JavaScript基础知识笔记
做前端几年了,一直疏于整理归纳,所以这两天把基础看了一遍,加上使用经验,整理了基础知识中关键技术,旨在系统性的学习和备忘.如果发现错误,请留言提示,谢谢! 重要说明:本文只列举基础知识点,中级和高级内 ...
- Scala基础知识[一]
摘要:在Scala 是 Scalable Language 的简写,是一门多范式(multi-paradigm)的编程语言.设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Jav ...
随机推荐
- Tomcat中的Filter
Filter 节选部分源码.源码版本 Tomcat8.5 说明 filter 是 Servlet 规范 filter 是在 ,执行 Servlet.service方法之前执行 Filter相关接口 p ...
- HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
Portal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Angular动态表单生成(一)
好久不写博客了,手都生了,趁着最近老大让我研究动态表单生成的时机,撸一发博客~~ 开源项目比较 老大丢给我了两个比较不错的开源的动态表单生成工具,这两个项目在github上的star数量基本持平: h ...
- FreeRTOS+ WolfSSL + Lwip Demo
FreeRTOS+ WolfSSL Demo下载 LWIP 源码下载 2018年2月5日09:39:08 WolfSSL is about 10 times smaller than yaSSL, ...
- Apache安装排错
今天安装一下Apache,发现报错,且在网上没有找到相关解决方法,所以记录一下 安装步骤:将下载好的apache包放置到要放置的目录中,最好是盘根目录下,然后命令行下进入到apache下面的bin目录 ...
- svn造成桌面图标显示问号
(1)在使用svn客户端的时候桌面的所有图标上面都加了一个“?”.而且在桌面上新建的文件夹或文件都会打个问号,下面是笔者搜集的方法:在桌面创建记事本文件,把这句话复制进去for /r . %%a in ...
- Jquery实现表单动态加减、ajax表单提交
一直在搞Java后台开发,记得刚工作那一两年时间搞过前后端交互开发,用的东西也是五花八门,当时觉得做页面展示给别人看,是很有成就的事情,不过现在感觉自己跟纯前端开发比起来弱爆了,不过如果你的目标是作为 ...
- JavaScript的迭代函数与迭代函数的实现
前言 如果对技术很自信,请直接看 实现的源码 如果想回顾一下基础,请按文章顺序阅读 说到迭代方法,最先想到的是什么?forEach还是map,迭代的方法ES5提供了5种方法 以下定义来自 Ja ...
- MongoDB基础命令及操作
MongoDB:NoSQL数据库 MongoDB中的重要指示点 MongoDB中的三要素 数据库 集合 文档 MongoDB中的数据存储是以Bson的形式存储的,Bson是二进制的json,所以看上去 ...
- PHP递归无限分类,数组和直接输出。
去年在一家公司做项目开发,用到商城三级分类,看了之前的程序员写的分类也是头大,三级分类,循环套循环三次( foreach(){ foreach(){ foreach(){ } } } ),然后写了一个 ...