scala中的访问修饰符位置解释

scala中的访问修饰符位置解释,scala,Scala,我发现我们可以在类名之前和之后使用访问修饰符。例如,我有两个类,如下所示 package com.company.package.sub_package protected class Animal1{ def makeSound(): Unit = println("Bow ow") } object Animal1{ def main(args: Array[String]) { val animal = new Animal2() animal.makeS

我发现我们可以在类名之前和之后使用访问修饰符。例如,我有两个类,如下所示

package com.company.package.sub_package

protected class Animal1{
  def makeSound(): Unit = println("Bow ow")
}


object Animal1{
  def main(args: Array[String])
  {
    val animal = new Animal2()
    animal.makeSound()
  }
}
在这里,Animal1主方法中出现一个错误,表示无法在对象Animal1中访问Animal2

如果我扩展Animal2类,子类就可以访问父类

我从中了解到,如果我们在类名后写protected,它对同一个包中的类不可用,如果我在类之前对它进行了修改,它对包中的所有类都可用,只对其子类可用,这是正确的假设吗?访问修饰符位置的确切意义是什么

访问修饰符位置的确切意义是什么

访问修饰符总是在它修改访问权限的对象之前

在第一个示例中,protected位于Animal1类之前,因此它控制对该类的访问

在第二个示例中,protected位于主构造函数之前,因此它控制对主构造函数的访问。注意:它在主构造函数之前并不明显,因为Animal2有一个空的主构造函数,但是Scala语言规范说,如果类没有参数列表,则插入一个空的参数列表

所以,你的Animal2类实际上相当于

二级动物保护{ def makeSound:Unit=printlnMeow } 限制对主构造函数的访问的一个典型原因是通过辅助构造函数或伴随模块中的工厂方法来控制实例创建

您可以在Scala语言规范中找到主构造函数的访问修饰符规范

访问修饰符位置的确切意义是什么

访问修饰符总是在它修改访问权限的对象之前

在第一个示例中,protected位于Animal1类之前,因此它控制对该类的访问

在第二个示例中,protected位于主构造函数之前,因此它控制对主构造函数的访问。注意:它在主构造函数之前并不明显,因为Animal2有一个空的主构造函数,但是Scala语言规范说,如果类没有参数列表,则插入一个空的参数列表

所以,你的Animal2类实际上相当于

二级动物保护{ def makeSound:Unit=printlnMeow } 限制对主构造函数的访问的一个典型原因是通过辅助构造函数或伴随模块中的工厂方法来控制实例创建


您可以在Scala语言规范的中找到主构造函数的访问修饰符规范。

在类之前修改的访问类似于类中任何其他值的访问修饰符。它指定该类在包含类外部和子类中的可见性

类后的访问修饰符应用于构造函数,并指定该类的伴随对象之外的构造函数的可见性

通常,它用于隐藏默认构造函数:

class Positive private(val i: Int)

object Positive {
  def apply(i: Int): Positive = new Positive(math.abs(i))
}

您可以访问正值的i字段,但它不能是负值。

在类之前修改的访问类似于类中任何其他值的访问修饰符。它指定该类在包含类外部和子类中的可见性

类后的访问修饰符应用于构造函数,并指定该类的伴随对象之外的构造函数的可见性

通常,它用于隐藏默认构造函数:

class Positive private(val i: Int)

object Positive {
  def apply(i: Int): Positive = new Positive(math.abs(i))
}
你可以访问一个正的i字段,但它永远不能是负的