1)scala中的类和java中基本相似。java
2)scala中的类一样经过class来进行声明。网络
3)scala中的类一样能够具备成员变量和成员方法。ide
4)scala中的类一样能够经过new关键字来建立出对象。函数
5)Scala中的类的成员默认的访问权限是public。也能够加private或protected。工具
6)当成员变量或成员方法是私有属性时,外部将不能直接访问,这个同java同样。this
示例:spa
class Person() { //建立一个类,并定义类里的两个成员变量name和age。以及一个成员方法 eat() //须要注意的是:scala中变量(var)声明时须要指定初始值, private var name = “” private var age = 0 def eat(){ println("eat") } }
和java不一样,scala中的类不须要明确声明一个构造器,而是直接将构造参数经过构造参数列表声明为类的一部分。.net
而直接写在类的体中的既不是类的成员变量也不是成员函数的部分,会自动收集为构造函数的体。scala
scala声明主构造的形式是在类右侧声明,若是不声明,Scala也提供了默认构造器。注意:当显示声明主构造器以后,默认的空构造器失效。code
示例:
//scala中的类不须要明确声明一个构造器,而是直接将构造参数经过构造参数列表声明为类的一部分 class Person(v1: String, v2: Int) { //建立一个类,并定义类里的两个成员变量name和age。以及一个成员方法 eat() //须要注意的是:scala中变量(var)声明时须要指定初始值, private var name = v1 private var age = v2 //而直接写在类的体中的既不是类的成员变量也不是成员函数的部分,会自动收集为构造函数的体。 //当调用构造方法时,会打印 …… 和*** println("…………") println("***") }
有些时候,一个类里须要多个构造器。scala里除主构造器以外的构造器被称为辅助构造器。
1)Scala的辅助构造器定义开始于def this()。
2)Scala里每一个辅助构造器的第一个动做都是调用同类的构造器。
示例:
class Person(v1: String, v2: Int) { private var name = v1 private var age = v2 //Scala的辅助构造器定义开始于 def this() //Scala里每一个辅助构造器的第一个动做都是调用同类的构造器 def this(v1: String) = { this(v1, 0) } def this(v2: Int) { this("", v2) } def this() { this("", 0) } }
一个完整的示例:
class Person(v1: String, v2: Int) { private var name = v1 private var age = v2 println("…………") println("***") def this(v1: String) = { this(v1, 0) } def this(v2: Int) { this("", v2) } def this() { this("", 0) } def getName() = { this.name } def setName(name: String) = { this.name = name } def getAge() = { this.age } def setAge(age: Int) = { this.age = age } def say() { println("say word") } }
1)scala中的类(class)不能定义静态成员(或静态方法),而代之以定义单例对象来替代。
2)单例对象须要经过object关键字来声明。
3)一个单例对象能够单独存在,也能够绑定到一个类上。
4)单例对象当中的全部方法,均可以不须要建立对象而直接经过object单例对象的名字直接来调用,用起来感受就像一个静态方法同样。
5)当一个单例对象和某个类写在同一个源文件中且共享同一个名字时,他们就产生了一个绑定的关系。此时单例对象称为该类的伴生对象。类称为该对象的伴生类。
6)类和他的伴生对象能够互相访问其私有成员。
7)以伴生的方式为类增长静态成员成为了可能。
8)单例对象不能new,所以也没有构造参数。
9)能够把单例对象看成是java中可能会用到的静态方法工具类。
10)做为程序的入口main方法必须是静态的,因此main方法必须处在一个单例对象中,而不能写在一个类中。
11)单例对象在第一次被访问时才会被初始化。
示例:
class Person(v1: String, v2: Int) { //此私有变量,伴生类能够访问 private var name = v1 private var age = v2 } //Person的单利对象,也即伴生类Person object Person { def shownamespace() { val p = new Person //能够访问类的私有变量 println(p.name) } def eat() { println("eat") } }
scala中一样支持抽象类的使用,抽象类的内部能够包含抽象方法和非抽象方法。抽象类不容许被实例化,抽象类主要是用来被继承的。
Scala的抽象类同java,经过abstract关键字来定义。抽象方法的特色:没有{}方法体。
示例:
abstract class Teacher { //抽象方法,返回值为Unit def makeNote() //抽象方法,返回值为String def teach():String def compute():Int //实体方法 def say(){} }
1)能够类比java中的接口,可是又和接口很是不同,特质至关于java中的接口,java中称为类实现了接口,scala中称为混入了特质。
2)和java中的接口不一样的是,scala中的特质能够包含具备方法体的方法。
和抽象类不一样的地方在于,scala的类只能单继承,可是能够多混入,利用这种方式能够实现相似c语言中多继承的特性。
3)在类中能够经过extends或with关键字来让类混入特质,若是类没有明确继承父类,extends关键字没有被占用就可使用extends。
4)可是如已经使用了extends显示的继承了父类,再向混入特质就要用with关键字了。
一个类的声明中只能有一个extends,可是能够有多个with。
示例:
trait Dance { def Balei() def floor() //trait相似于java的接口,但能够作具体方法的实现 def eat(){} } trait Driver { def shache():String def piaoyi() } //scala中,只能继承一个父类,可是能够混入多个特质(trait) //须要实现特质中未实现的方法 //此外,须要注意的是,若是未继承任何类或抽象类,在混入特质时, //好比有且仅有一个特质须要用extends来混入,而其余特质用with混入 class ZhangTeacher extends Dance with Driver { def Balei(): Unit = { ??? } def floor(): Unit = { ??? } def piaoyi(): Unit = { ??? } def shache(): String = { ??? } }
1)只要在声明类时,在class关键字前加上case关键字,这个类就成为了样例类。样例类必需要显式的声明一个主构造器。
2)当样例类声明一个主构造器后,会默认隐式的声明一个空构造器。
3)样例类默认实现序列化接口。
序列化的两个做用:①数据持久化;②网络数据传输。
4)样例类默认自动覆盖toString、equals、hashCode方法。
5)样例类不须要new能够直接生成对象。
示例:
//须要声明一个主构造器,主构造器能够是一个空构造器 case class Item(v1:Int,v2:String) { var id=v1 var title=v2 } //样例类不须要new,而且隐式的含有空构造器 val v1=Item(1,"phone") //> v1 : Item = Item(1,phone) val v2=Item //> v2 : Item.type = Item
在Scala中用来表示一个结果,它可能有值,也可能没有值,它有两个子Option。一个是Some,一个是None。
示例:
def f1(a:Int,b:Int)={ if(b!=0){ Some(a/b) }else{ None } } //表示若是有正确结果,返回正确结果,没有则返回指定的默认值 f1(4,0).getOrElse("error")
相似于java中经过import关键字引入包/类,scala也能够实现这种方式引入,可是更强大一些。
1)scala中的import能够出如今代码任何地方。
2)scala中的import时能够指的是对象和包。
3)scala中的import能够重命名或隐藏一些被引用的成员。
4)scala默认会自动引入以下三个包下的全部内容。
java.lang:java中的通用类。
scala._:scala提供的通用类 主要是基本类型除了String。
Predef._:提供了单例对象 以及一些经常使用方法 print println。
示例:
import cn.tedu._ import cn.tedu.{Apple,Orange}
1)重写是指覆盖父类中的方法来在子类中作其余事项。
格式:
override def 父类方法名 参数列表 返回值 方法体
2)重载是指在同一个类中提供方法名相同可是参数不一样的方法和java中基本一致。
示例:
能够用在成员变量、成员方法、类自己上,做用和java中相同。
示例:
object Demo13{ def main(args: Array[String]): Unit = { val t1:Teacher=new TeacherChen("chen",32) val t2:Teacher=new TeacherLiu("liu",32) } }
基本和java中相同,不一样的是,泛型是用方括号引发来的。
val arr = Array[String]();
上一篇:Scala中的集合类型