一般来讲内部类的作用域只在外部类包围的范围内,即内部类属于实例化对象:
举例:
class OuterClass{
class Student(val name: String){}
//ArrayBuffer[Student] 中的Student类是对象内部类,即区分c1.Student类型和c2.Student类型
val students = new ArrayBuffer[Student]()
def register(name: String) = {
new Student(name)
}
}
val c1 = new OuterClass
val cys = c1.register("cys")
c1.students += cys
val c2 = new OuterClass
val joe = c2.register("joe")
//不能将cys [c1.Student] 赋值 c2的students内,因为c2的students 接受的参数是c2.Student
//c2.students += cys
扩大内部类作用域:(1)将内部类放在外部类的伴生对象里面,从而实现实例化对象可相互访问内部类
import scoreTest.Score.OuterClass.Student
object OuterClass{
class Student(val name: String)
}
class OuterClass{
val students = new ArrayBuffer[Student]()
def register(name: String)={
new Student(name)
}
}
val c1 = new OuterClass
val cys = c1.register("cys")
c1.students += cys
val c2 = new OuterClass
//c2可以添加cys
c2.students += cys
println(cys.getClass) //class scoreTest.Score$OuterClass$Student
扩大内部类作用域:(2)类型投影:指定
import scala.collection.mutable.ArrayBuffer
object Score extends App {
class OuterClass{
class Student(val name: String){}
//ArrayBuffer[Student] 中的student是OuterClass的student --》类型投影:指定student内部类属于外部类,而不是实例化后的对象
val students = new ArrayBuffer[OuterClass#Student]()
def register(name: String) = {
new Student(name)
}
}
val c1 = new OuterClass
val cys = c1.register("cys")
c1.students += cys
val c2 = new OuterClass
val joe = c2.register("joe")
//c2可以添加cys
c2.students += cys
println(cys.getClass) //class scoreTest.Score$OuterClass$Student
}
内部类使用外部类变量,或者同名变量
object Score extends App {
class OuterClass(val name: String){ outer =>
//outer 用于标识外部作用域,可随意替换名字
class Student(val name:String){
def introduceMyself = "hello, i'm "+ name + ", happy to join class " + outer.name
}
}
}