==> 类

        ---> 类的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
class  Student{
     // 定义属性
     private  var  stuName : String  =  "Tom"
     private  vat stuAge : Int  =  18
     
     // 定义方法
     def  getStuName() : String  =  stuName
     def  setStuName(newName : String)  =  {
         this .stuName  =  newName
     }
     
     
}


        ---> 伴生类和伴生对象    object 相当于 Java 中的 static

            ---- object 对象可以跟类名不一样,如果跟类名一样,这个对象就是该类的伴生对象,反之,这个类就是这个伴生对象的伴生类

        ---> set 和 get 方法  

            ---- Scala 中,会自动给 private 定义的属性生成get和set 方法,使用 val 可以使其只生成 get 方法,而不会生成set 方法

            ---- 在定义变量时使用 this 关键字,可以使其成为此类的私有属性,不会生成 get 和 set 方法,如:

1
2
3
4
5
6
7
8
  // 定义正常的属性,可自动生成get 和 set  方法
  private  var  aaa : String  =  "hello"
  
  // 定义只可自动生成 get 方法的属性
  private  val  aaa : String  =  "hello"
  
  // 使用this 关键字,使其定义的属性成为此类的私有属性,不允许外界访问
  private [ this var  aaa : String  =  "hello"


        ---> 嵌套类(内部类)

            ---- 内部类中的参数可以当做类的参数传递

        ---> 类的构造器

            ---- 主构造器 和类的声明在一起,只能有一个主构造器

1
2
3
4
5
6
7
8
9
10
class  Student( val  stuName :  String,  val  stuAge :  Int){
 
}
 
object  Student{
     def  main(args :  Array[String]) :  Unit  =  {
         var  stu  =  new  Student( "Tom" 20 )
         println(stu.stuName +  "\t"  + stu.stuAge)
     }
}


            ---- 辅助构造器  可以有多个辅助构造器,使用 this 关键字

1
2
3
4
5
6
7
8
9
10
11
12
class  Student( val  stuName : String,  val  stuAge : Int){
     // 定义一个辅助构造器
     def  this (age : Int){
     // 调用主构造器
     this ( "No Name" , age)
     }
}
 
object  Student{   // 
     var  stu  =  new  Student( 22 )
     println(stu.stuName +  "\t"  + stu.stuAge)
}     // 输出结果为 NoName   22


        ---> Object 对象: 相当于 Java 中的 static 关键字

            ---- 单例模式: 一个类只有一个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 生成信用卡的卡号
object  CreditCard{
     // 定义变量: 保存信用卡的卡号
     // 该属性只属于该对象 
     private [ this var  creditCardNumbe : Long  =  0
     
     // 产生卡号
     def  generateNewCCNumber() : Long  =  {
         creditCardNumbe + =  1
         creditCardNumber
     }
     
     // 测试程序
     def  main(args : Array[String]) :  Unit  =  {
     // 得到新的卡号
         println(CreditCard.generateNewCCNumber)
         println(CreditCard.generateNewCCNumber)
         println(CreditCard.generateNewCCNumber)
         println(CreditCard.generateNewCCNumber)
     }
}


            ---- 应用程序对象: App   ----- 可以省略 main 方法

1
2
3
4
object  testApp  extends  App {
     // 省略了 main 方法,可以直接将结果输出
     println( "hello" )
}

        ---> 类的 apply 方法

            ---- 作用: 创建对象时,省略 new 关键字,需要定义在类的伴生对象中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class  Student(stuName : String){
 
}
 
object  Student{
     // 定义 apply 方法,必须定义在类的伴生对象中
     def  apply(stuName :  String)  =  {
         // 调用主构造器
         new  Student(stuName)
     }
     def  main(args :  Array[String]) :  Unit  =  {
         var  stu  =  Student( "Tom" )
     }
}

==> 继承

        ---> 简单继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 测试
object  DemoExtends{
   def  main(args :  Array[String]) :  Unit  =  {
     // 创建一个 Person 对象
     val  p 1 : Person  =  new  Person( "Tom" 20 )
     println(p 1 .sayHello())             // My name is Tom,age is 20
 
     // 创建一个子类
     val  p 2 : Person  =  new  Employee( "Marry" 32 1233 )
     println(p 2 .sayHello())             // 子类中的 sayHello
 
     // 创建一个匿名子类
     val  p 3 : Person  =  new  Person( "Jerry" 33 ){
       override  def  sayHello() :  String  =  "匿名函数中的 sayHello 方法"
     }
     println(p 3 .sayHello())             // 匿名函数中的 sayHello 方法
   }
}
// 父类
class  Person( val  name : String,  val  age : Int){
   def  sayHello() : String  =  "My name is "  + name +  ",age is "  + age
}
 
// 子类    如果需要子类的值覆盖父类的值,需要加上 override 参数
class  Employee( override  val  name : String,  override  val  age : Int,  val  salary : Int)  extends  Person(name, age){
   override  def  sayHello() :  String  =  "子类中的 sayHello"
}

        ---> 继承抽象类和抽象字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
object  TestExtendsDemo {
   def  main(args :  Array[String]) :  Unit  =  {
     var  apple : Fruit  =  new  Apple()
     var  orange : Fruit  =  new  Orange()
 
     println(apple.name())         // 结果为 apple
     println(orange.name())         // 结果为 orange
 
   }
}
 
abstract  class  Fruit{
   var  id : Int
   def  name() : String
   
}
 
class  Apple  extends  Fruit{
    // 实现抽象字段
    var  id : Int  =  1
   // 实现抽象方法
   def  name() : String  =  {
     "apple"
   }
 
}
 
// 可以通过构造方法对抽象字段进行处理
class  Orange()  extends  Fruit{
   def  name : String  =  {
     "orange"
   }
 
}

        ---> 特质trait: 有点像接口,也有点像抽象类    支持多重继承,可以定义抽象方和字段,也可以定义完整的方法和字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
object  Demo 1  {
 
   def  main(args :  Array[String]) :  Unit  =  {
     var  com : Computer  =  new  Computer( 1 )
     println(com.run())
     println(com.movedown())
   }
 
}
 
class  Computer( var  monitorid : Int)  extends  Monitor  with  Mouse  with  Keyboard {
   def  run() : String  =  {
     "running"
   }
 
   def  moveup() :  String  =  {
     "moveup"
   }
 
   override  def  movedown() :  String  =  {
     "movedown"
   }
 
   override  def  press() :  String  =  {
     "press"
   }
 
}
 
trait  Monitor{
   var  monitorid : Int
   def  run() : String
 
}
 
trait  Mouse{
   def  moveup() : String
   def  movedown() : String
}
 
trait  Keyboard{
   def  press() : String
}


==> 包的定义和使用

        ---> 包的定义:

1
2
3
4
5
6
7
8
// 定义格式一
package  com.mytest
class  Demo{}
 
// 定义格式二
package  com.mytest{
     class  Demo{}
}


        ---> 包的使用(引入):

1
2
3
import  com.mytest.Demo         // 可以不写Demo 的全路径
import  com.mytest. _             // 引入mytest 包下所有的属性
import  com.mytest.Demo. _         // 引入 Demo 类中所有的属性


==> 包对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package  object  MyPackageDemo{
     // 常量
     val  a : Int  =  1
     // 变量
     var  a : String  =  "hello"
     // 方法
     def  Demo() : String  =  {
         "Demo"
     }
     // 类
     class  Demo{
         
     }
     // 对象 object
     object  Demo{
     
     }
     // trait(特质)
     trait  Demo{
     
     }
}