scala(3)面向对象编程之类

定义一个简单的类:

package com.doit.scc

// 定义类,包含field以及方法
class HelloWorld {
  private var name = "leo"
  def sayHello(){print("Hello" + name)}
  def getName = name
}
/*
函数:类外边定义的def
方法:类内定义的def
注意:如果定义的def后的方法名没加(),在调用的时候就不能加();
定义def的方法名加了()调用时,可以加()也可以不加()
 */
package com.doit.scc

object text {
  def main(args:Array[String]):Unit = {
    val helloworld = new HelloWorld
    helloworld.sayHello()     //Helloleo
    print(helloworld.getName)    //leo
  }
}

自定义getter与setter

package com.doit.scc

// 自定义getter与setter
class GaS {
  // 如果只是希望拥有简单的getter和setter方法,那么就按照scala提供的语法规则,根据需求为field选择合适的修饰符就好:var、val、private、private[this]
  // 但是如果希望能够自己对getter与setter进行控制,则可以自定义getter与setter方法
  // 自定义setter方法的时候一定要注意scala的语法限制,签名、=、参数间不能有空格
  private var myName = "leo"
  def name = "your name is " + myName   //getter
  def name_= (newValue:String){    //注意:name_与=之间没有空格 setter
    println("you cannot edit your name!!!")
  }
}
测试:
object text {
  def main(args:Array[String]):Unit = {
    val leo = new GaS
    println(leo.name)    //your name is leo
    leo.name="leo1"     //you cannot edit your name!!!
  }

}

private

package com.doit.scc

class p_this {
  // 如果将field使用private来修饰,那么代表这个field是类私有的,在类的方法中,可以直接访问类的其他对象的private field
  private var myAge = 0
  def age_=(newValue: Int) {
    if (newValue > 0) myAge = newValue
    else print("illegal age!")
  }
  def age = myAge
  def older(s: p_this) = {
    if(myAge > s.myAge) print("older")
  }
}

测试:val pt = new p_this
    pt.age= 19
    val pp = new p_this
    pp.age= 11
    pt.older(pp)
运行结果:older
测试:val pt = new p_this
  pt.age= -8
  val pp = new p_this
  pp.age= 11
  pt.older(pp)
运行结果:illegal age!

private[this]

class p_this {
  // 这种情况下,如果不希望field被其他对象访问到,那么可以使用private[this],意味着对象私有的field,只有本对象内可以访问到
  private[this] var myAge = 0
  def age_=(newValue: Int) {
    if (newValue > 0) myAge = newValue
    else print("illegal age!")
  }
  def age = myAge
  def older(s: p_this) = {
    if(myAge > s.myAge) print("older")
  }
}
测试:val pt = new p_this
    pt.age= 19
    val pp = new p_this
    pp.age= 11
    pt.older(pp)
会报错:Error:(12, 18) value myAge is not a member of com.doit.scc.p_this
    if(myAge > s.myAge) print("older")
这是因为在older方法中,调用了pp.myage,但是,之前定义个字段是private[this],只有当前类可用

Java风格的getter和setter方法

Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式
如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可
此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unit

package com.doit.scc;

import scala.beans.BeanProperty;
class GaS_2{
  @BeanProperty var name: String = _
}
测试:val s = new GaS_2
  	s.setName("ynn")
  	print(s.getName())
运行结果:ynn
//或者也可以在构造函数处加这个注解
package com.doit.scc;

import scala.beans.BeanProperty;
class GaS_2(@BeanProperty var name: String){
}
测试:val s = new GaS_2("ynn")
  	 print(s.getName())
运行结果:ynn

辅助constructor

package com.doit.scc

class constructor {
  // Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载
  // 辅助constructor之间可以互相调用,而且必须第一行调用主constructor
  private var name = "lingling"
  private var age = 0
  def this(name:String){
    this()
    this.name = name
    println("your name is " + name)
  }
  def this(name:String,age:Int){
    this(name)
    this.age = age
    println("you are " + age + " years old")
  }
}
测试:val c1 = new constructor("ning")   //运行结果:your name is ning
  	 val c2 = new constructor("ning",20)  //运行结果:your name is ning   you are 20 years old

主constructor

Scala中,主constructor是与类名放在一起的,与java不同,而且类中,没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码,这点感觉没有java那么清晰

package com.doit.scc

class constructor_2(val name:String,val age:Int) {  //主constructor
  println("your name is " + name,"you are " + age + " years old")

}
测试: val s = new constructor_2("ning",20)
运行结果:(your name is ning,you are 20 years old)
// 主constructor中还可以通过使用默认参数,来给参数默认的值
package com.doit.scc
class constructor_2(val name:String = "ning",val age:Int=20) {
  println("your name is " + name,"you are " + age + " years old")
}
测试: val s = new constructor_2()
运行结果:(your name is ning,you are 20 years old)
// 如果主constrcutor传入的参数什么修饰都没有,比如name: String,那么如果类内部的方法使用到了,则会声明为private[this] name;否则没有该field,就只能被constructor代码使用而已。

内部类

package com.doit.scc

import scala.collection.mutable.ArrayBuffer

class Class {
  class Student(val name:String){}
    val student = new ArrayBuffer[Student]
    def getStudent(name:String)={
      new Student(name)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值