一、类(class)
1.1、class定义
- Scala中定义和Java一样,都是使用
class关键字 - 和Java一样,使用new关键字创建对象
package com.strivelearn.scala
/**
* @author strivelearn
* @version Person.java, 2022年11月12日
*/
class Person {
var name: String = "scala";
/**
* 如果在定义方法的时候指定(),那么在调用的时候()可写可不写
*/
def sayHello(): Unit = {
println("Hello " + name)
}
/**
* 如果在定义方法的时候没指定(),则调用方法的时候肯定不能带()
* @return
*/
def getName: String = name
}
package com.strivelearn.scala
/**
* @author xys
* @version PersonTest.java, 2022年11月12日
*/
object PersonTest {
def main(args: Array[String]): Unit = {
val person = new Person()
person.sayHello();
println("================================")
println(person.getName)
}
}
Hello scala
================================
scala
1.2、构造函数constructor
- Scala的主constructor是与类名放在一起的,与Java不同
- 注意:在类中,没有定义在任何方法或者是代码块之中的代码就是主constructor的代码
- 主构造函数可以通过默认参数,来给参数设置默认值
package com.strivelearn.scala.objectoriented
/**
* @author strivelearn
* @version Student.java, 2022年11月12日
*/
class Student(val name: String, val age: Int) {
println("name is " + name + " age is " + age)
}
package com.strivelearn.scala.objectoriented
/**
* @author strivelearn
* @version StudentTest.java, 2022年11月12日
*/
object StudentTest {
def main(args: Array[String]): Unit = {
val student = new Student("张三", 21)
}
}
name is 张三 age is 21
class Student(val name: String = "java", val age: Int = 21) {
println("name is " + name + " age is " + age)
}
1.3、辅助构造函数
- Scala可以给类定义多个辅助构造函数,类似于Java中的构造函数重载
- 辅助构造函数可以互相调用,第一行必须调用主构造函数
package com.strivelearn.scala.objectoriented
/**
* 定义个主构造函数是空的
*
* @author strivelearn
* @version Student.java, 2022年11月12日
*/
class Student {
var name = "java"
var age = 20
def this(name: String) {
this()
this.name = name
}
def this(name: String, age: Int) {
this(name: String)
this.age = age
}
}
二、对象(object)
Scala中的class与Java中的class是类似的,Java中没有的内容叫做Object。
- object相当于class的单个实例,通常在里面放一些静态的
field或者method - object不能定义带参数的构造函数,只有空参构造函数
- 第一次调用object的方法时,会执行object的构造函数,仅执行一次
- object通常作为单例模式的实现,或者放class的静态成员
- object不能new,可以直接使用
package com.strivelearn.scala.objectoriented
/**
* @author strivelearn
* @version PersonObj.java, 2022年11月12日
*/
object PersonObj {
var age = 1
println("这是PersonObj")
def getAge = age
}
2.1、伴生对象
- 如果有一个class。还有一个与class同名的object,那么就称这个object是class的
伴生对象,class是obejct的伴生类 - 伴生类与伴生对象必须存放在一个.scala文件之中
- 伴生类和伴生对象最大特点在于可以互相访问private field
package com.strivelearn.scala.objectoriented.test1
import com.strivelearn.scala.objectoriented.test1.Person.fdNum
/**
* @author strivelearn
* @version Person.java, 2022年11月13日
*/
class Person(val name: String, val age: Int) {
def sayHello: Unit = println("name:" + name + ",age:" + age + ",fdNum:" + Person.fdNum)
}
//伴生对象
object Person {
private val fdNum = 1
def getFdNum: Int = fdNum
}
package com.strivelearn.scala.objectoriented.test1
/**
* @author strivelearn
* @version PersonTest.java, 2022年11月12日
*/
object PersonTest {
def main(args: Array[String]): Unit = {
val zhangsan = new Person("zhangsan", 20)
zhangsan.sayHello
}
}
2.2、apply
- apply是object中非常重要的一个特殊方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能
- 在创建对象的时候,就不需要使用new Class的方法了,而是使用class()的方式,隐式调用伴生对象的apply方法,这样会让对象创建更加简洁
package com.strivelearn.scala.objectoriented.test2
/**
* @author strivelearn
* @version Person.java, 2022年11月13日
*/
//伴生类
class Person(val name: String) {
println("name: " + name)
}
//伴生对象
object Person {
def apply(name: String): Person = {
println("apply exec ...")
new Person(name)
}
}
package com.strivelearn.scala.objectoriented.test2
/**
* @author strivelearn
* @version PersonTest.java, 2022年11月13日
*/
object PersonTest {
def main(args: Array[String]): Unit = {
val jack = Person("jack")
}
}
apply exec ... name: jack
三、main方法
-
和Java一样,在Scala中如果要运行一个应用程序,必须有一个main方法,作为入口
-
Scala中的main方法必须定义在object中,格式为
def main(args: Array[String]): Unit = { //todo }
四、接口(trait)
- 类继承
trait后,必须实现trait中的抽象方法,实现时不需要使用override关键字 - scala不支持对类进行多继承,但是支持对
trait进行多重继承,使用with关键字即可
package com.strivelearn.scala.objectoriented.test3
/**
* @author strivelearn
* @version Fly.java, 2022年11月13日
*/
trait Fly {
/**
* 使用xxx飞行
*
*/
def canFly()
}
trait Swimming {
/**
* 使用xxx游泳
*
*/
def canSwim()
}
class Person extends Fly with Swimming {
/**
* 使用xxx飞行
*
* @param skill
*/
override def canFly(): Unit = {
println("人类使用飞机进行飞翔")
}
/**
* 使用xxx游泳
*
*/
override def canSwim(): Unit = {
println("人类使用双手进行游泳")
}
}
object Person {
def main(args: Array[String]): Unit = {
val person = new Person()
person.canFly()
person.canSwim()
}
}
人类使用飞机进行飞翔 人类使用双手进行游泳