@@ -9,15 +9,18 @@ package cn.edu.jxnu.scala.basic
99class CompanionClass {
1010
1111
12- private val str1 = " hello" ;
12+ private val str1 = " hello"
1313
1414 def print (): Unit = {
1515 println(CompanionClass .str2)
1616 }
1717
18-
18+ // 源文件名称可以和类名不同
1919}
2020
21+ /**
22+ * ============================构造函数、实例化规则==============================================
23+ */
2124// 伴生对象与伴生类同名,同一源文件中
2225// 注意单例对象是一等的,是特殊的class
2326object CompanionClass extends App {
@@ -27,28 +30,28 @@ object CompanionClass extends App {
2730 // 3.混入特质并重写main
2831 // 继承/混入APP特质
2932 // 单例可以混入特质
30- private val str2 = " world" ;
33+ private val str2 = " world"
3134 val companionClass = new CompanionClass () // new只能实例化类
3235 println(companionClass.str1) // 单例对象类似Java的static方法调用
3336 companionClass.print() // 可以互相访问对方的私有属性,方法
3437
3538}
3639
3740class Construction {
38- // class有主构造器和辅助构造器,辅助构造器第一行代码必须用调用主构造器
41+ // class有主构造器和辅助构造器,辅助构造器第一行代码须用调用主构造器(例外可以是:另一个调用了主构造的辅助构造)
3942 def this (var1 : String ) = {
4043 // 无返回值类型
4144 this () // 因为此时默认的主构造就是无参
4245 }
4346}
4447
45- // 使用var表示在类的内部和外部均可以修改 (因为生成字段var1,和var1的set方法)
48+ // 使用var表示在类的内层和外层均可以修改 (因为生成字段var1,和var1的set方法)
4649// var1不使用val、var修饰则Scala不会为其生成字段以及访问器,只能暂时使用该变量
4750class Construction2 (var1 : String , var2 : String ) {
4851 // 类结构可以嵌入主构造,此时主构造就是2个参数
4952 // 定义一个参数的辅助构造
5053 def this (var1 : String ) = {
51- this (null , " hello" ) // 同样需要第一行调用主构造
54+ this (null , " hello" ) // 同样需要第一行调用主构造,或者是调用另一个出现在发起调用的构造方法之前的另一个辅助构造
5255 }
5356}
5457
@@ -69,7 +72,7 @@ class Construction4 @SerialVersionUID(1L)(override val var1: String, override va
6972
7073 // 1.java的super是静态绑定的
7174 // 在java(单一继承)里面,假设有一个对象a,它既是类型X,又是类型Y,那么X和Y必定具有“父子关系”,也就是说,其中一个是另一个的父类。
72- // 因为java的继承是单一继承,不管实际类型是什么,一个对象的“继承链”,从super所在类开始往左的部分 ,都是在编译时期就可以确定下来的。
75+ // 因为java的继承是单一继承,不管实际类型是什么,一个对象的“继承链”,从super所在类开始往左的层分 ,都是在编译时期就可以确定下来的。
7376 // 2.scala的super是动态绑定的
7477 // 在scala(多重继承)里面,假设有一个对象a,它既是trait X,又是trait Y, X和Y可能具有父子关系,也可能是共享同一个祖先的“兄弟”,反正,它们的关系不再限定在“父子”上。
7578 // 因为scala允许多重继承,父亲类和trait们的优先顺序,是由对象的实际类型的线性化结果决定的,所以需要动态绑定。
@@ -88,3 +91,84 @@ class Construction4 @SerialVersionUID(1L)(override val var1: String, override va
8891
8992}
9093
94+ // 样例类的主构造必须得有参数
95+ // 初始化可以省略new
96+ // 因为默认自带equals、toString等。可以使用==比较,也可以使用println直接打印内容
97+ // match模式匹配时用的比较多
98+ // 默认生成自己的伴生对象
99+ case class Construction5 (name : String , pws : String = " pass" )
100+
101+ object TestcaseClass extends App {
102+
103+ val jack = Construction5 (" name" , " password" )
104+ val rese = Construction5 (" name" )
105+ println(jack, rese)
106+ val name = jack.name // 样例类的实例内容可以直接打印
107+ println(jack.name == " name" , rese == Construction5 (" name" ))
108+
109+ }
110+
111+ /**
112+ * ==============================内层类,访问权限============================
113+ **/
114+ object OutPrivateClass extends App {
115+
116+ private val name : String = " hello"
117+
118+ // def getInnerName = println(InnerPrivateClass.innerName) //编译出差,禁止访问内层单例的私有
119+
120+ object InnerPrivateClass {
121+
122+ private val innerName : String = " hello"
123+
124+ def test () = print(name)
125+ }
126+
127+ InnerPrivateClass .test() // 内层单例,可以读取外层单例的私有属性
128+
129+ }
130+
131+ class OutPrivateClass {
132+ // 外层类别名,这之间不能有任何代码
133+ outer =>
134+
135+ class InnerPrivateClass2 {
136+ // 访问内层类的私有,拒绝访问
137+ // private val innerName = "world"//
138+ // 可以访问
139+ val innerName = " world"
140+
141+ def info () = println(" 访问外层类的私有属性试试:" + name)
142+
143+ // 在内层类通过【外层类.this.成员名称】 访问外层类成员
144+ def info1 = println(" Outer name :" + OutPrivateClass .this .name + " ,Inner Name :" + name)
145+
146+ // 在内层类通过【外层类别名】 访问外层类成员
147+ def info2 = println(" Outer name :" + outer.name + " ,Inner Name :" + name)
148+
149+ }
150+
151+ // 访问内层类的私有,拒绝访问(即使你new了这个对象,你也无法得到私有属性,是非常严格的判定,与Java不同)
152+ // def getInnerName = new InnerPrivateClass2().innerName
153+ // 可以访问
154+ def getInnerName = println(" 外层类访问内层类的属性:" + new InnerPrivateClass2 ().innerName)
155+
156+ // private val name: String = "hello" //下面方法均正常输出
157+ // val name: String = "hello" //下面方法均正常输出
158+ // 限定具体的包的权限
159+ private [basic] val name : String = " hello" // 下面方法均正常输出
160+
161+
162+ }
163+
164+ object TestInnerPrivateClass extends App {
165+
166+ val out1 = new OutPrivateClass ()
167+ out1.getInnerName
168+ val inner1 = new out1.InnerPrivateClass2 () // 注意:Scala内层类是从属于外层类对象的。类似Java的static内部类的实例方式
169+ inner1.info()
170+ inner1.info1
171+ inner1.info2 // 定义的时候不加括号,调用的时候就不能加
172+
173+ // PS:内部==内层==被嵌套类,外部==外层==嵌套类
174+ }
0 commit comments