1. 类

1.1. 类的定义

package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的。* Scala源文件中可以包含多个类,所有这些类都具有共有可见性。* Created by toto on 2017/6/29.*/
class Person {//用val修饰的变量是可读属性,有getter但没有setter(相当与Java中用final修饰的变量)val id = "9527"//用var修饰的变量都既有getter,又有settervar age : Int = 18//类私有字段,只能在类的内部使用private var name : String = "toto"//对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段//在伴生对象里面也不可以访问,这里相当于是java中private的,没有getter和setter的方法private[this] var pet = "小强"def sayHi() : Unit = {//下面的运行结果是:9527println(id)//下面的结果是:18println(age)//说明在自己的类中可以访问到,下面的运行结果是:totoprintln(name)//说明只有在类里面可以访问到private[this]类型的变量,下面的运行结果是"小强",说明已经被修改了。println(pet)}
}/*** 这个名字和类名相同,叫伴生对象*/
object Person {//在伴生变量中定义的变量相当于就是静态变量var i = 1//在伴生变量中定义的方法相当于是静态方法def main(args: Array[String]): Unit = {//结果是:1println(i)val p = new Person()//如果是下面的修改,发现下面有红线,说明val类型的不支持重新赋值//p.id = "123"//下面的结果是:9527println(p.id)//下面的结果是:18println(p.age)p.age = 27//下面的结果是:27println(p.age)//下面的结果是:唐伯虎println(p.name)p.name = "toto"//这里说明可以在伴生对象中访问到私有的变量//下面的结果是:totoprintln(p.name)p.sayHi()}
}object Test {def main(args: Array[String]): Unit = {var p = new Person()//运行结果是18println(p.age)//运行结果是:9527println(p.id)/*** 下面的运行结果是:* 9527* 18* 唐伯虎* 小强*/p.sayHi()//这里不可以直接通过p.pet访问到。//这里面也不可以访问到p.name}
}

1.2. 构造器

注意:主构造器会执行类定义中的所有语句

package cn.toto.scala.day2import java.io.IOException/*** Created by toto on 2017/6/29.** 构造器参数可以不带val或var,如果不带val或var的参数至少被一个方法所使用* 那么它将被提升为字段** 跟类名交织在一起的叫   主构造器* val定义的只能读不能改(成员变量)* var 可以读,有了默认值,在传参的时候,可以不传参了。* faceValue :可以通过这个为它初始赋值,有了默认值,可以不传参了,相当于private[this],只能在类的内部使用*/
class Student(val name : String,var age:Int,faceValue:Double = 99.9,private var height : Int = 18) {//主构造器会执行类定义中的所有语句println("执行主构造器")//faceValue被下面的方法使用后,faceValue就变成了不可变的对象私有字段了,等同于private[this] val faceValue//如果没有被方法使用该参数将不被保存为字段,仅仅是一个可以被主构造器中的代码访问的普通参数def description = name + " is " + age + " years old,颜值是:" + faceValue//定义为辅构造函数用private[this] var gender : String = nulltry {println("读取文件");throw new IOException("io exception");} catch {case e:NullPointerException => println("打印异常Exception:" + e)case e:IOException => println("打印异常Exception:" + e)}def show() : Unit = {//faceValue = 1000println(faceValue)}//用this关键字定义辅助构造器//辅助构造器 def this (参数)def this(name : String,age : Int,gender: String) {//每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始//第一行必须先调用主构造器this(name,age)println("执行辅助构造器")println("faceValue:" + this.faceValue)println("height:" + this.height)//对于没法在主构造器中定义的变量,可以定义一个私有字段this.gender = genderprintln("gender:" + this.gender)}
}object Student {def main(args: Array[String]): Unit = {/*** 私有的构造器,只有在其伴生对象中使用** 下面立即执行出结果:* 执行主构造器* 读取文件* 打印异常Exception:java.io.IOException: io exception*/val p = new Student("toto", 27, 100, 180)//运行结果是:27println(p.age)//运行结果是:totoprintln(p.name)p.age = 18p.height = 199;//运行结果是:18println(p.age)//运行结果是:199println(p.height)//运行对的结果是:toto is 18 years old,颜值是:100.0println(p.description)var per = new Personprintln(per)}
}object Main {def main(args: Array[String]): Unit = {/*** 理解执行出结果:* 执行主构造器* 读取文件* 打印异常Exception:java.io.IOException: io exception*/val stu1 = new Student("toto",30)//只是:toto,说明调用的不是辅助构造器println(stu1.name)/*** 调用的时候就立即显示:* 执行主构造器* 读取文件* 打印异常Exception:java.io.IOException: io exception* 执行辅助构造器* faceValue:99.9* height:18* gender:男*/var stu2 = new Student("toto",27,"男")println(stu2.age)println(stu2.name)//下面的取不到//println(stu2.height)//下面的也获取不到//println(faceValue);}
}

1.3. 单例对象

在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
1.存放工具方法和常量
2.高效共享单个不可变的实例
3.单例模式

package cn.toto.scala.day2import scala.collection.mutable.ArrayBufferobject SingletonDemo {def main(args: Array[String]) {//单例对象,不需要new,用【类名.方法】调用对象中的方法val session = SessionFactory.getSession()//获得结果:cn.toto.scala.day2.Session@96532d6println(session)}
}object SessionFactory {//该部分相当于java中静态块var counts = 5val sessions = new ArrayBuffer[Session]()while(counts > 0) {sessions += new Sessioncounts -= 1}//在object中的方法相当于java中的静态方法def getSession() : Session = {sessions.remove(0)}
}class Session {}

在如:

package cn.toto.scala.day2/*** Created by toto on 2017/6/29.*/
class SingletonDemo2 {println("abc")SingletonDemo2.sayHi()SingletonDemo2test()def test() : Unit = {println("test")}
}object SingletonDemo2 {private val t = 123def sayHi() : Unit = {println("hi ~")}/*** 运行的结果是:* hi ~* 123* 123* abc* hi ~* test* hi ~* ()* cn.toto.scala.day2.SingletonDemo2$@5e025e70* cn.toto.scala.day2.SingletonDemo2$@5e025e70* cn.toto.scala.day2.SingletonDemo2$@5e025e70*/def main(args: Array[String]): Unit = {sayHi()println("123")println(t)val s = new SingletonDemo2val s1 = SingletonDemo2.sayHi()println(s1)val s2 = SingletonDemo2val s3 = SingletonDemo2println(s3)println(s3)val s4 = SingletonDemo2println(s4)}
}

1.4. 伴生对象

在Scala的类中,与类名相同的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性

package cn.toto.scala.day2/*** Created by toto on 2017/6/29.*/
class Dog {val id = 1private var name = "toto"def printName() : Unit = {//在Dog类中可以访问伴生对象Dog的私有属性println(Dog.CONSTANT + name)}
}object Dog {//伴生对象中的私有属性private val CONSTANT = "汪汪汪 : "/*** 运行结果是:* 汪汪汪 : toto* 汪汪汪 : 123* @param args*/def main(args:Array[String]): Unit = {val p = new Dog//访问私有字段namep.printName()p.name = "123"p.printName()}
}

1.5. apply方法

通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,…参数n)时apply方法会被调用

package cn.toto.scala.day2/*** Created by toto on 2017/6/30.*/
object ApplyDemo {def main(args: Array[String]): Unit = {//調用了Array半生对象的apply方法//def apply(x:Int,xs:Int*):Array[Int]//arr1中只有一个元素5var arr1  = Array(5)println(arr1.toBuffer)//new了一个长度为5的array,数组里面包含5个nullvar arr2 = new Array(5)}
}

在如:

package cn.toto.scala.day2/*** Created by toto on 2017/6/30.*/
object ApplyDemo {def apply() : Unit = {println("apply invoked")}def apply(name:String):String = {name}def apply(name:Int) : Int = {println("Int")name}/*** 从下面的案例中可以知道,若没有使用new关键字创建实例,它将使用相应的apply方法来创建实例* @param args*/def main(args: Array[String]): Unit = {// //运行结果是:apply invoked//  val a1 = ApplyDemo()结果直接是tom//val a2 = ApplyDemo("tom")//结果是:Intval a3 = ApplyDemo(10)//打印的结果是:10println(a3)}
}

1.6. 应用程序对象

Scala程序都必须从一个对象的main方法开始,可以通过扩展App特质,不写main方法。

package cn.toto.scala.day2/*** Created by toto on 2017/6/30.* //运行结果是:I love you Scala*/
object AppObjectDemo extends App{//不用写main方法println("I love you Scala")
}

Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象相关推荐

  1. java程序中类的成员变量定义在_.在类体中,变量定义部分所定义的变量称为类的________。...

    .在类体中,变量定义部分所定义的变量称为类的________. .成员变量在整个类内都有效,________变量只在定义它的方法内有效. .Java中成员变量又分为实例成员变量和________. . ...

  2. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  3. scala方法中的变量_Scala变量,变量范围,字段变量,方法参数示例

    scala方法中的变量 Variables can be defined as the reserve space in memory to store the assigned values. Ba ...

  4. scala方法中的变量_Scala中的变量

    scala方法中的变量 Scala变量 (Scala variables) A variable is named a reference to a memory location. The loca ...

  5. python3 模块调用其他类的方法_python类的函数调用 python如何引用其他模块中类的方法中的变量?...

    python中类内部的函数可以互相调用吗? python 如何调用类的方法要遇上一个人只要用一分钟的时间:要喜欢上一个人只要用一句话的时间:要爱上一个人只要用一天的时间:但要忘记一个人却要用一生的时间 ...

  6. mysql存储过程变量定义_存储过程中MySQL变量定义和赋值

    MySQL变量定义和赋值是我们经常会遇到的问题,下面就为您接受如何在存储过程中MySQL变量定义和赋值,希望对您学习MySQL变量定义方面能有所启迪. 一.MySQL变量的定义 mysql变量定义用d ...

  7. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

  8. java接口如何定义常量 c_在Java接口中怎样访问定义的常量呢?

    java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).那么我们在Java接口中怎 ...

  9. C++ 中的变量定义

    变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储. 变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; 在这里,typ ...

最新文章

  1. 心音数据库_小V云端数据库 | 2020.9.14—2020.9.18
  2. java race condition_java多线程(一)Race Condition现象及产生的原因
  3. 2020-07-01 CVPR2020 表示学习论文讨论(2) 笔记
  4. python函数模块化教程_【软件测试教程】Python模块化以及内置模块的使用
  5. 数据库中存储过程和触发器有什么异同?
  6. oracle decode函数
  7. MTK模拟器编译使用
  8. hadoop之Combiner
  9. 魔方矩阵c语言,C语言检验并打印魔方矩阵,检验并打印魔方矩阵,用C语言,求大神尽快解决...
  10. 一位全减器逻辑电路图_一种一位全减器电路的制作方法
  11. 企业微信群:机器人实现定时提醒功能
  12. ACM在线测试题C++实现蛇形填数
  13. js eval Uncaught SyntaxError: unexpected token: ‘:‘
  14. day5有效字母得移位两个数组的交集快乐数两个数之和
  15. VB如何使用API直接操作打印机
  16. Android设置app显示指定国家语言
  17. Parameter 参数与 Argument 参数
  18. 查询批量文件中关键数据方法--uedit32工具
  19. 从零开始的MySQL教程——上
  20. 做网站申请域名有什么方法?

热门文章

  1. 在python中,用正则表达式提取多层括号中最外层括号包含的内容
  2. 1.Hadoop的学习(Linux的基础命令)
  3. opencv学习笔记20:图像轮廓
  4. Servlet 过滤器
  5. VTK:反射用法实战
  6. OpenCASCADE绘制测试线束:数据交换命令之IGES 命令
  7. wxWidgets:避免内存泄漏
  8. (boost::mp11::mp_rotate_left相关用法的测试程序
  9. boost::log模块测量日志记录发射的性能
  10. boost::format模块演示添加到 printf 语法的功能