访问权限
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("调用子类的辅助构造器")
}
}