📅  最后修改于: 2021-01-09 11:51:16             🧑  作者: Mango
特征就像具有部分实现的接口。在scala中,特征是抽象和非抽象方法的集合。您可以创建可以具有所有抽象方法或某些抽象方法和某些非抽象方法的特征。
通过在trait中使用val或var关键字声明的变量在实现trait的类中内部实现。通过使用val或var声明但未初始化的任何变量都被视为抽象变量。
特性被编译为具有相应实现类的Java接口,这些实现类包含特征中实现的任何方法。
trait Printable{
def print()
}
class A4 extends Printable{
def print(){
println("Hello")
}
}
object MainObject{
def main(args:Array[String]){
var a = new A4()
a.print()
}
}
输出:
Hello
如果类扩展了特征但未实现在该特征中声明的成员,则必须将其声明为抽象。让我们来看一个例子。
trait Printable{
def print()
}
abstract class A4 extends Printable{ // Must declared as abstract class
def printA4(){
println("Hello, this is A4 Sheet")
}
}
如果一个类实现了多个特征,它将扩展第一个特征,类,抽象类。 with关键字用于扩展其余特征。
您可以使用trait实现多个继承。
trait Printable{
def print()
}
trait Showable{
def show()
}
class A6 extends Printable with Showable{
def print(){
println("This is printable")
}
def show(){
println("This is showable");
}
}
object MainObject{
def main(args:Array[String]){
var a = new A6()
a.print()
a.show()
}
}
输出:
This is printable
This is showable
您也可以像抽象类一样在trait中定义方法。即,您也可以将特征视为抽象类。在scala中,特质与抽象类几乎相同,只是它不能具有构造函数。您不能扩展多个抽象类,但可以扩展多个特征。
trait Printable{
def print() // Abstract method
def show(){ // Non-abstract method
println("This is show method")
}
}
class A6 extends Printable{
def print(){
println("This is print method")
}
}
object MainObject{
def main(args:Array[String]){
var a = new A6()
a.print()
a.show()
}
}
输出:
This is print method
This is show method