scala权限 构造器介绍

本文详细介绍了Scala中的访问权限,包括public、private、protected和包访问权限的区别,并通过案例说明了它们的使用场景。此外,还讲解了Scala中的方法、构造器的基本语法和用法,以及构造器参数的三种类型。最后,提到了Scala的单继承特性及其在实际代码中的应用。

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

访问权限

1)说明

在Java中,访问权限分为:public,private,protected和默认。在Scala中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。

(1)Scala 中属性和方法的默认访问权限为public,但Scala中无public关键字。

(2)private为私有权限,只在类的内部和伴生对象中可用。

(3)protected为受保护权限,Scala中受保护权限比Java中更严格,同类、子类可以访问,同包无法访问。

(4)private[包名]增加包访问权限,包名下的其他类也可以使用

2)案例实操

package chapter06

object Test04_Access {

  def main(args: Array[String]): Unit = {

    // 同一个包都可以访问的到

    Person04.name1

    // 受保护的权限  同一个包也无法访问

//    Person04.name2

    // 访问公共的权限

    Person04.name3

  }

}

class Person04{

  val nameClass = Person04.name

  val name1Class = Person04.name1

  // 受保护的权限

  protected val name2:String = "受保护的权限"

}

object Person04{

  // 私有的权限能够在当前类和当前伴生对象中调用

  private val name:String = "私有权限"

  // 包访问权限

  private[chapter06] val name1:String = "包访问权限"

  // public的权限

  val name3:String = "公共的权限"

}

不同包的调用:

package chapter06Test

import chapter06.Person04

/**

 * @author yhm

 * @create 2021-09-15 16:11

 */

object Test04_Access {

  def main(args: Array[String]): Unit = {

    // 不同的包里面无法访问name1  包访问权限

//    Person04.name1

    // 不同的包也能访问到公共的权限

    Person04.name3

  }

}

class Student04 extends Person04{

  // 即使不是一个包  继承的子类也能够访问到受保护的权限

  val name2Class = name2

}

6.2.3 方法

1)基本语法

def 方法名(参数列表) [:返回值类型] = {

方法体

}

2)案例实操

class Person {

    def sum(n1:Int, n2:Int) : Int = {

        n1 + n2

    }

}

object Person {

    def main(args: Array[String]): Unit = {

        val person = new Person()

        println(person.sum(10, 20))

    }

}

6.2.4 构造器

和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法。

Scala类的构造器包括:主构造器和辅助构造器

1)基本语法

class 类名(形参列表) {  // 主构造器

   // 类体

   def  this(形参列表) {  // 辅助构造器

   }

   def  this(形参列表) {  //辅助构造器可以有多个...

   }

} 

说明

(1)辅助构造器函数的名称this,可以有多,编译器通过参数的个数及类型来区分。

(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。

(3)构造器调用其他另外的构造器,要求被调用构造器必须提前声明。

2)案例实操

(1)如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略。

package chapter06

object Test06_Constructor {

  def main(args: Array[String]): Unit = {

    val person0 = new Person06("zhangsan")

    val person01 = new Person06()

    println(person01.name1)

    val person02 = new Person06("lisi", 18)

  }

}

// 主构造器  直接写在类的定义后面  可以添加参数  可以使用权限修饰符

//class Person06 private(name:String){

//  val name1 = name

//}

class Person06 (name:String){

  println("调用主构造器")

  val name1 = name

  var age:Int = _

  // 两个辅助构造器  再互相调用的时候 只能是下面的辅助构造器调用上面的辅助构造器

  def this(){

    // 辅助构造器的第一行 必须直接或简介的调用主构造器

    // 直接调用主构造器

    this("zhangsan")

    println("调用辅助构造器1")

  }

  def this(name:String,age1:Int){

    // 间接调用主构造器

    this()

    this.age = age1

    println("调用辅助构造器2")

  }

}

6.2.5 构造器参数

1)说明

Scala类的主构造器函数的形参包括三种类型:未用任何修饰、var修饰、val修饰

(1)未用任何修饰符修饰,这个参数就是一个局部变量

(2)var修饰参数,作为类的成员属性使用,可以修改

(3)val修饰参数,作为类只读属性使用,不能修改

2)案例实操

package chapter06

object Test07_ConstructorArgs {

  def main(args: Array[String]): Unit = {

    val person0 = new Person07("zhangsan",11,"男")

    println(person0.name)

    println(person0.age)

    println(person0.sex)

  }

}

// 主构造器参数 分为3类:

// 没有修饰符 : 作为构造方法中的传入参数使用

// val 修饰 : 会自动生产同名的属性 并且定义为val

// var 修饰 : 会自动生产同名的属性 并且定义为var

class Person07 (name1:String,val age:Int,var sex:String){

   val name = name1

//  val age = age

//  var sex = sex

}

6.4 继承

1)基本语法

class 子类名 extends 父类名  { 类体 }

(1)子类继承父类的属性方法

(2)scala是单继承

2)案例实操

(1)子类继承父类的属性方法

(2)继承的调用顺序:父类构造器->子类构造器

package chapter06

object Test08_Inherit {

  def main(args: Array[String]): Unit = {

    // 子类继承父类的属性和方法

    val student0 = new Student08

    println(student0.name)

    println(student0.age)

    student0.sayHi

    println("===========================")

    val student01 = new Student08("lisi")

  }

}

class Person08 () {

  println("调用父类的主构造器")

  var name  = "person"

  var age = 18

  def sayHi: Unit ={

    println("hi person")

  }

  def this(name:String){

    this()

    this.name = name

    println("调用父类的辅助构造器")

  }

}

// 子类继承

// scala中的继承本质上是继承一个父类的构造器

class Student08 (name:String) extends Person08 (name:String){

  println("调用子类的主构造器")

  def this(){

    this("zhangsan")

//    this.name = name

    println("调用子类的辅助构造器")

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值