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

(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作为返回值可以增加程序的灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值