scala是以实现scaleable language为初衷设计出来的一门语言。官方中,称他是object-oriented language和functional language的混合式语言。
三个特殊内容:
1.Tuple-可以将不同类型的数据存储在一个数组里
val pair = (99,"Luftballons")
println(pair._1)
println(pair._2) 输出:99 Luftballons
2.singleton object-scala中没有静态方法和属性 (什么是静态方法?c++中 若类的方法前加了static关键字,则称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,只要定义了类,不必建立类的实例就可以使用。静态方法只能使用累的静态成员。)全部由singleton object(单例对象)来代替。
class SimpleGreeter {
val greeting = "Hello,world!"
def greet() = println(greeting)
}
val g = new SimpleGreeter
g.greet ()
----------------------------------------------------------
class FancyGreeter(greeting:String){
def greet() = println(greeting)
}
val g = new Fancygreeter("Salutations,world")
g.greet
----------------------------------------------------------
class WorldlyGreeter(greeting: String){
def greet() = {
val worldyGreeting = WorldlyGreeter.worldify(greeting)
println(worldyGreeting)
}
}
object WorldlyGreeter{
def worldify(s: String) = s + ", world!"
}
object WorldlyApp{
def main(args: Array[String]){
val wg = new WorldlyGreeter("Hello")
wg.greet()
}
}
3.trait-scala中的类interface物,但是可以拥有方法体,并且可以在类实例化的时候混入,而不需要为了包装某个类而产生子类。
(1)java的interface只定义方法名称和参数列表,不能定义方法体。而trait则可以定义方法体。
如:trai Friendly{
def greet() = "Hi"
}
(2)在java中实现借口用implement,而在scala中,实现trait用extends。scala中的class可以继承0至多个traits.
scala中重写一个方法是需要制定override关键字的。
(3)java的interface和scala中的trait的最大的区别是,scala可以在一个class实例化的时候混合进一个trait。
trait Friendly{
def greet() = "Hi"
}
class Dog extends Friendly{
override def greet() = "Woof"
}
class HungryDog extends Dog{
override def greet() = "I'd like to eat my own dog food"
}
trait ExclamatoryGreeter extends Friendly{
override def greet() = super.greet() + "!"
}
var pet : Friendly = new Dog
println (pet.greet())
pet = new HungryDog
println(pet.greet())
pet = new Dog with ExclamatoryGreeter
println(pet.greet())
pet = new HungryDog with ExclamatoryGreeter
pritln(pet.greet())
这样写的好处是什么呢?
从前,如果想要输出在HungryDog类的“I'd like to eat my own dog food”输出的基础上变成“I'd like to eat my own dog food!",那么需要再添加一个子类,并重写它的方法,给字符串加上感叹号,而在trait中,只需要在HungryDog类实例化的时候with 上一个trait,就可以达到包装的效果了。