Scala之旅-class和object详解

本文深入探讨Scala中的类与对象概念,包括类的构造器、字段的统一访问原则及object的使用方式。通过实例讲解了如何利用apply方法实现单例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.class

scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C#的简易属性类似;若使用了private修饰,则它的方法也将会是私有的。这就是所谓的统一访问原则。

细节的东西太多,还是上代码在注释里面细讲吧

//类默认是public级别的
class Person{
  var age=18  //字段必须得初始化()
  def Age=age //这个是方法,没有参数可以省略()
  def incremen(){this.age+=1}
}


class Student{
  var age=20     //底层编译器会自动为私有的age添加get和set的公有方法,可以理解为伪public类型
  private[this] var gender="male" //private[this] 只有该类的this可以使用
  private var name="clow" //声明了private,底层编译器会自动为私有的name添加get和set的私有方法
  //但是可以自己定义属性方法
  def getName=this.name
  def setName(value:String){this.name=value}
}

//构造器的使用
class Teacher {
  var age: Int = _
  var name: String = _  //可以预留

  //重载的构造器和C#里面的public Teacher(){}类似
  def this(age: Int, name: String){
    this() //必须得调用一次主构造器
    this.age=age
    this.name=name
  }
}

类的构造器细节

//1.主构造器在类名后,参数会被声明字段,若参数没有使用var或者val声明,则会被声明称私有字段
//2.实例化类的时候,类中的语句会被执行:println("person")
class Person(name:String,var age:Int) {
  println("person")

  def show(): Unit = {
    println("show.."+name)
  }

  var gender:String=_

  //次构造器必须调用主构造器,参数不能使用var
  def this(name:String,age:Int, gender:String){
    this(name,age)
    this.gender=gender
  }
}


2.scala没有静态的修饰符,但object下的成员都是静态的 ,若有同名的class,这其作为它的伴生类。在object中一般可以为伴生类做一些初始化等操作,如我们常常使用的val array=Array(1,2,3)  (ps:其使用了apply方法)

object Dog{
  private var age=0
  def Age={
    age+=1
    age
  }
}

class Dog{
  var age1=Dog.age //Dog.age是object Dog的私有字段。这不禁让我回想起了C++的友元类
}

3.Apply的使用

class ApplyTest{

  val name="clow";
  def apply()  {
    println("class ApplyTest--apply()...");
  }

}

//object下的成员默认都是静态的
object ApplyTest{
  def apply() = {
    println("object ApplyTest--apply()...");
    new ApplyTest()
  }
}


object Basic4 {

  def main(args: Array[String]) {
    //类名()->调用了对应object下的apply方法
    var a1=ApplyTest()
    println(a1.name)
    //对象名()->调用了对应class的apply方法
    a1() //输出:class ApplyTest--apply()...
  }
}

Apply怎么用它来实现单例模式

class ApplyTest private{  //添加private隐藏构造器
  def sayHello(){
    println("hello jop")
  }
}

object ApplyTest{
  var instant:ApplyTest=null
  def apply() ={
    if(instant==null) instant=new ApplyTest
    instant

  }
}

object ApplyDemo {
  def main(args:Array[String]){
      val t=ApplyTest()
      t.sayHello()
  }
}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值