设为首页 加入收藏

TOP

Scala-Unit5-Scala面对对象与模式匹配(一)
2019-08-15 00:11:09 】 浏览:116
Tags:Scala-Unit5-Scala 面对 对象 模式 匹配

  Java中的面向对象:万物皆对象。

  我们要封装数据,定义模板等操作,素以我们需要面向对象。

=========================================================================

一、Scala中的单例对象

  在java中用static关键字修饰方法或成员变量,作用是可以直接通过"类名."的方式调用方法或变量

  在Scala中没有static关键字,Scala给我们提供了单例对象的模式来实现,关键字是object

object Person {
  //定义成员变量
  val name:String = "Hunter"
  //定义类方法
  def sleep(str:String):Unit= {
    println(str)
  }
}

object ScalaDemo{
  def main(args: Array[String]): Unit = {
    print(Person.name)
    Person.sleep("睡得很香")
  }
}

  在Scala中的object是一个单例对象,object中定义的方法和成员变量都是静态的,在其他的单例对象中可以直接通过“类名.”的方式进行调用。

  main方法也只能定义在object中,因为java中main方法为静态方法。

  通过class创建的类中定义的方法和对象不能直接调用,不许构造函数对象后才可调用。

 

二、Scala类与构造器的使用

  1.类的定义和使用,例子:

class Person1 {
  //定义成员变量姓名、年龄
  var name:String = _
  var age:Int = _
  //注释:_的意思是不给定,可以在其他类或单例对象中调用赋值,所以用var定义
}

//继承App特质,可以不写main方法,类似java的Test/Before
object Test1 extends App{
  val p  = new Person1
  p.name = "reba"
  p.age = 18
  println(p.name + p.age + "岁")
}

  2.主构造器:写在类名后面的构造器是主构造器 

class Person2 (name:String,age:Int){

}

object Test2 extends App{
  val p = new Person2("yangmi",24)
  println(p)
  println(p.toString)     //这两行输出的都是地址,原因见辅助构造器
}

  注意:主构造器里的变量没有var,val修饰不能被调用

  3.辅助构造器:定义在类内部的构造器,一个类中可以有多个辅助构造器

class Person3 (var name:String,age:Int){
  var high:Int = _
  var weight:Int = _

  //定义辅助构造器
  def this(name:String,age:Int,high:Int){
    this(name,age)
    this.high = high
  }

  //辅助构造器可以定义多个
  def this(name:String,age:Int,high:Int,weight:Int){
    this(name,age)
    this.high = high
    this.weight = weight
  }
}

object Test3 extends App{
  val p = new Person3("Hunter",34,180,140)
  p.weight = 150
  println(p.name + "身高:" +p.high + ",体重:" + p.weight)
}

  注意:(1)辅助构造器内必须先声明主构造器中的所有变量,在声明自己的变量

     (2)Scala中主构造器中的变量如果没有被val、var修饰的话,是不能被访问的,
         相当于java没有给这个变量get/set方法;
         如果主构造器中的变量被val修饰,相当于提供了java中的get方法,
         如果主构造器中的变量被var修饰,相当于提供了java中的get和set方法。

  4.构造器的访问权限:private

    在主构造器或辅助构造器前添加private关键字修饰,即可限制其访问权限

//定义私有主构造器
class Person4 private(var name:String,age:int){
  var high:Int = _
  //定义私有辅助构造器
  private def this(name:String,age:Int,high:Int){
    this(name,age)
    this.high = high
  }
}


object ScalaDemo{
  def mian(args:Array[String]):Unit ={
    val p = new Person4("h",88)
    val p1 = new Person3(name = "r",age =18)
    println(p.name)
  }

}

 注意:编译时Idea不报错,运行时才会报错;

    但是编程时如果主构造器不是私有的,定义时会出现变量名的提示(如Person3,而Person4没有提示)

  5.类的访问权限,在类前添加private修饰

  测试:

  //测试封装类如下,[this]会根据情况变化为无、[scala04]父包、[demo]子包

private[this] class Person5(var name:String,age:Int) {
  var high:Int = _

  def this(name:String,age:Int,high:Int){
    this(name,age)
    this.high = high
  }
}

  //测试运行单例对象如下:

object ScalaDemo  {
  def main(args: Array[String]): Unit = {
    val p = new Person5("h",18,182)
    println(p.name)
  }
}

     1>>封装类在父包,省略this,测试类在父包       √
     2>>封装类在父包,省略this,测试类在子包       √
     3>>封装类在父包,添加this,测试类在子包       √
     4>>封装类在父包,添加this,测试类在父包     √
     5>>封装类在父包,添加demo,测试类在父包    ×
     6>>封装类在父包,添加demo,测

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Akka-Cluster(6)- Cluster-Shar.. 下一篇Scala-Unit6-final/type关键字、..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目