Scala基础

Posted 你∈我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala基础相关的知识,希望对你有一定的参考价值。

单例对象(object)

Scala的类中无法定义静态成员,即无static关键字。如何像Java一样表达类的静态成员变量、成员方法与静态代码块?

Scala解决方案:单例对象

  • 使用“object”关键字声明,可包含变量、方法与代码定义
  • 单例对象中的成员变量、成员方法通过单例对象名直接调用
  • 单例对象第一次被访问时初始化,并执行全部代码块
  • 单例对象不能new,且无构造参数
  • 程序入口main()方法必须定义在单例对象中
  • 单例对象与同名类定义在同一文件中时形成绑定关系
//定义一个单例对象
object Student
    def s(name:String,age:Int):Unit = print(name+","+age)

伴生

伴生即单例对象与同名类定义在同一文件中时形成绑定关系

  • 前提:同一个文件的class和object 名字相同,伴生类和伴生对象在同一个文件中,名字相同
  • 同名类称为单例对象的伴生类(class)
  • 单例对象称为同名类伴生对象(object) 

伴生类与伴生对象可相互访问各自私有成员
伴生对象可为伴生类增加静态成员

伴生类中可以在域中直接使用:类名.方法 的方式调用伴生对象中的方法
在main方法中:
1.使用伴生类直接建立一个实例,属性和方法只能是class域中的
2.使用伴生对象提供的实例,属性和方法只能是object域中的
3.伴生对象中定义apply方法可以不使用new新建实例

// 互为伴生类、伴生对象
class Oop1         // 类
object Oop1       // 对比java中的静态类,可以理解为对象
 
// 不是伴生关系
class Oop1 
object Oop 

创建语法

伴生对象中的属性可以直接使用类名进行调用;伴生类中的属性,需要先实例化对象,才能够进行调用。

没有class,只有object则是单例模式类。

scala中伴生类&伴生对象的语法如下:

class Test
  val a:Int = 10;
  var b:Int = 2;


object Test
  val object_v1:String = "变量1";
    
  def main(args: Array[String]): Unit = 
    // 注:只有伴生对象中可以定义主函数,类似于static修饰
    println("伴生对象变量:" + Test.object_v1);
    println("伴生类变量:" + (new Test()).a);
  

apply()

apply()是一个语法糖,直接调用类(对象)名称时候,默认执行的是该类(对象)的apply()方法。

目的是为了适应函数式编程的编码规范,可以在伴生对象的apply()中new一个对象,使用案例如下:

object Test
    def apply():Test= new Test();
    def main(args: Array[String]): Unit = 
        // 变量复制,直接可以实例化对象,不需要再new了
        val ad1 = Test();
    

案例

//伴生类和伴生对象在同一个文件中,名字相同,class类称为object的伴生类,object称为class的伴生对象

//定义伴生类
class Person(uname:String, uage:Int)    //Scala主构造函数,主构造函数定义在类的头部
  println("class 进入到Person的class类中")
  var name:String = uname
  var age:Int = uage
  private var address:String = "亚洲"
  
  def this()  //从构造方法 
    this("xxx",0)
    println("class this() 从构造方法")
  
  def this(age:Int)
    this("XXX",age)
  
  def this(name:String)
    this(name,0)
  
  println("class 变量定义完成,准备定义方法")
  
  //定义伴生类中的方法
  def printMsg(): Unit =
    println(Person.name+" "+Person.age+" "+address)
    Person.showMsg()
  
  println("class类一次游,准备离开Person类")



//定义伴生对象
object Person  //伴生对象  相当于java中的Static
  println("object 进入到Person伴生对象中。。。")
  private val name:String = "中国"
  private val age:Int = 71
  
  //定义apply方法
  def apply(uname: String, uage: Int): Person = new Person(uname, uage)
  def apply(uname: String): Person = new Person(uname)
  def apply(uage: Int): Person = new Person(uage)
  def apply(): Person = new Person()

  println("object 变量定义完成,准备定义方法")
  def showMsg():Unit=
    println(Person.name+" "+Person.age)
  
  
  //定义方法,获得class中的属性
  def showBSClass(p:Person): Unit =
    println(p.address)
  
  
  //main方法
  def main(args: Array[String]): Unit = 
    println("object main 进入到main方法中")
    
    //使用object的apply方法新建对象,只能使用class中的属性和方法
    val po1 = Person("zs",21)  //相当于:val person = Person.apply("aa",12)
    val po2 = Person()
    val po3 = Person("kb09")
    val po4 = Person(12)

    Person.showBSClass(po1)

	//使用从构造方法
    var p1:Person = new Person()
    var p2:Person = new Person(21)
    var p3:Person = new Person("zhangsan")
 
 	//使用class新建对象,只能使用class中的属性和方法
 	var personNew:Person = new Person("zs",21)
 	//使用object提供的对象,只能使用object中的属性和方法
    var personObj = Person
    personObj.showMsg()
    personNew.printMsg()
  
  println("object 伴生对象一次游结束")

scala scala 基础

 

 至于什么是scala,摘录一段 维基百科的解释:

 

 scala 下载 安装 省略

1.环境变量配置完成后 命令行报错,因为scala 的安装路径里边包含空格

修改后即可。由于我的本地包含空格,此处CLI交互就省略了。

2.IDEA 下载scala 插件 配置SDK。eclipse 省略。

  

3. 创建scala 入门项目,创建单例对象object

入门级Hello World 

object Hello {

  def main(args: Array[String]): Unit = {
    println("Hello Scala.");
  }

}  

main 方法. 运行即可。

方法定义 中 要有 = ,Unit 相当于java中的void.不必深究,入门即可,不断学习后会理解更深入。

 

以上是关于Scala基础的主要内容,如果未能解决你的问题,请参考以下文章

大数据Scala学习—列表 集与映射

大数据Scala学习—列表 集与映射

「大数据」(八十六)Scala基础

大数据Hadoop之——Scala基础

scala基础

大数据学习06 Scala的基础语法