scala面向对象-封装

  • 概念

把数据和对数据的操作进行封装在一起,只能通过被授权的操作才能对数据进行操作;

scala的public属性,底层是private,为此不建议直接将属性设置为private;

有时候为了和java相互调用进行交互,而java框架都是利用反射调用get和set方法,为此scala中在属性上增加@BeabProperty;

  • 访问权限

scala中属性和方法默认为public,但是并无public关键字,private只有在类的内部和伴生对象中使用;

protected同类和子类可以访问,同包不能访问;

private修饰的包名增加了包的访问权限,包名其他类可以使用;

package com.byxrs.chapter06

object Test_ClassForAccess {

}

class Person{
  private var idCord :String = "123"
  protected var name :String = "123"
  var sex :String = "female"
  private[chapter06] var age :Int = 18

  def printlnPersonInfo() ={
    println(s"Person: $idCord $name $sex $age")
  }
}
package com.byxrs.chapter06

object Test_Access {
  def main(args: Array[String]): Unit = {
    val person = new Person
    //idCard不能访问
    //name不能访问,因为protected只能在当前类以及子类中才能访问
    println(person.age)
    println(person.sex)
    person.printlnPersonInfo()

    val worker = new Worker
    worker.printlnPersonInfo()
  }
}

class Worker extends Person{
  override def printlnPersonInfo(): Unit = {
    println("Worker:")
    //idCard不能访问
    name = "kitty"   //protected同类和子类可以访问,同包不能访问
    age = 50
    sex = "male"
    println(s"Person: $name $sex $age")
  }
}

运行结果:
18
female
Person: 123 123 female 18
Worker:
Person: kitty male 50
  • 构造器

包含主构造器和辅助构造器 this,主构造器只能有一个,辅助构造器可以有多个。

注:辅助构造器不能创建对象,只能直接或者间接的调用主构造器来创建对象;

构造器可以调用其他的构造器,但是要求被调用的构造器提前声明才能调用;

 

class 类名(形参列表) { // 主构造器
 // 类体
 def this(形参列表) { // 辅助构造器
 }
 def this(形参列表) { //辅助构造器可以有多个...
 }
} 
//1. 辅助构造器 函数的名称 this, 可以有多个,编译器通过不同参数来区分
  • 构造器参数

主构造器参数包含:没用修饰符,var修饰符,val修饰符;

package com.byxrs.chapter06

object Test6_ConstructorParams {
  def main(args: Array[String]): Unit = {
    val student2 = new Student2
    println(s"student2:name=${student2.name},age=${student2.age}")
    student2.name = "tom"
    student2.age = 18
    println(s"student2-1:name=${student2.name},age=${student2.age}")

    val student3 = new Student3("kitty", 35)
    println(s"student3:name=${student3.name},age=${student3.age}")

    val student4 = new Student4("joy", 20)
    //报错,student4.name无法通过该方式获取值
    //    println(s"student4:name=${student4.name},age=${student4.age}")
    //解决办法就是在类中写方法
    student4.getInfo()

    val student5 = new Student5("poty", 30)
    println(s"student5:name=${student5.name},age=${student5.age}")
    //报错,val不能修改值
    //    student5.age = 31
    val student6 = new Student6("amy", 16, "清华学院")
    println(s"student6:name=${student6.name},age=${student6.age},age=${student6.school}")
  }

}

//无参构造器,()可省略
class Student2 {
  var name: String = _
  var age: Int = _
}

//主构造器带参,{ }可省略,scala推荐使用这样的方式。可以完成java三大步骤
// 1.定义参数,2.将参数传入构造器,3.并赋值如this.name = name
class Student3(var name: String, var age: Int)

//主构造器参数无修饰符
class Student4(name: String, age: Int) {
  def getInfo(): Unit = {
    println(s"student4:name=$name,age=$age")
  }
}

//val修饰的参数不能更改,这样的写法不常用
class Student5(val name: String, val age: Int)

class Student6(var name: String, var age: Int) {
  var school: String = _

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

  def getInfo(): Unit = {
    println(s"student6:name=$name,age=$age,school=$school")
  }
}

运行结果:
student2:name=null,age=0
student2-1:name=tom,age=18
student3:name=kitty,age=35
student4:name=joy,age=20
student5:name=poty,age=30
student6:name=amy,age=16,age=清华学院

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值