您的位置:首页 > 其它

Scala语言一些的一些注意事项汇总(1)

2017-11-08 08:22 309 查看
(1)外层包无法直接访问内层包

(2)scala允许在任何地方进行包的引入,_的意思是引入该包下的所有类和对象

(3)在scala中没有public关键字,仅有private 和 protected访问控制符,当一个类成员不加private和protected时,它的访问权限就是public.

(4)在java语言中,protected成员不但可以被该类及其子类访问,也可以被同一个包中的其它类使用,但在scala中,protected成员只能被该类及其子类访问

(5)无修饰符的成员同java 的public,可以在任何位置进行访问

(6)在scala中提供了更为灵活的访问控制方法,private、protected除了可以直接修饰成员外,还可以以private[X]、protected[X]的方式进行更为灵活的访问控制,这种访问控制的意思是可以将private、protected限定到X,X可以是包、类,还可以是单例对象.如:private[scala]限定Utils只能在scala及子包中使用。

(7)private[this],限定只有该类的对象才能访问,称这种成员为对象私有成员,伴生类对象也不能用。

(8)private,定义的类及伴生对象可以访问;

(9)


(10) 包对象主要用于将常量、工具函数,使用时直接通过包名引用;

(11) 外部类不能访问内部类的成员域,但内部类可以直接访问外部类成员域,哪怕这个成员域是private私有的.

(12) 内部类除了是一个类之外,与外部类的成员没有任何区别,它可以与外部类的成员域一样被使用.

(13)如果父类是抽象类,则不override关键字可以不加,这是因为如果继承的父类是抽象类(假设抽象类为AbstractClass,子类为SubClass),在SubClass类中,AbstractClass对应的抽象方法如果没有实现的话,那SubClass也必须定义为抽象类,否则的话必须要有方法的实现,这样的话,加不加override关键字都是可以的。

(14)匿名类

abstract class Person(name:String,age:Int){

def walk():Unit

}

object demo{

def main(args: Array[String]): Unit = {

//下面的代码定义了一个匿名类,并且进行了实例化

//直接new Person("john",18),后面跟的是类的内容

//我们知道,Person是一个抽象类,它是不能被实例化的

//这里能够直接new操作是因为我们扩展了Person类,只不

//过这个类是匿名的,只能使用一次而已

val s=new Person("john",18){

override def walk()={

println("Walk like a normal Person")

}

}

s.walk()

}

}


(15)多态的定义:多态”(Polymorphic)也叫“动态绑定”(Dynamic Binding)、“迟绑定”(Late Binding),指“在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用其相应的方法。”即指子类的引用可以赋给父类,程序在运行时根据实际类型调用对应的方法

(16)继承的缺点有以下几点:

  1 父类的内部细节对子类是可见的。

  2 子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。

3 如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想。

(17)组合的优点:

   1 当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。

  2 当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。

  3 当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。

 (18)组合的缺点:

  1 容易产生过多的对象。

  2 为了能组合多个对象,必须仔细对接口进行定义。

(19)组合比继承更具灵活性和稳定性,所以在设计的时候优先使用组合。只有当下列条件满足时才考虑使用继承:

1 子类是一种特殊的类型,而不只是父类的一个角色

2 子类的实例不需要变成另一个类的对象

3 子类扩展,而不是覆盖或者使父类的功能失效

(20)处于继承层次最顶层的是Any类,它是scala继承的根类,scala中所有的类都是它的子类

(21)根类Any有两个子类,它们分别是AnyVal和AnyRef,其中AnyVal是所有scala内置的值类型( Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit.)的父类,其中 Byte, Short, Char, Int, Long, Float, Double, Boolean与java中的byte,short,char,int,long,float,double,boolean原生类型对应,而Unit对应java中的void类型,由于( Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit)继承AnyVal,而AnyVal又继承Any,因此它们也可以调用toString等方法。

(22)()可以作为Unit类型的实例,它同样可以调用toString等方法

(23)scala中的==操作它不区分你是原生类型还是引用类型

equals方法是检查值是否相等,而eq方法检查的是引用是否相等。所以如果比较的对象是null那么==调用的是eq,不是null的情况调用的是equals。

(24) Null类型是所有AnyRef类型的子类型,也即它处于AnyRef类的底层,对应java中的null引用。而Nothing是scala类中所有类的子类,它处于scala类的最底层。

(25)Nothing这个类一般用于指示程序返回非正常结果,利用Nothing作为返回值可以增加程序的灵活性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala 语言