1.包
Scala中的包与java有着诸多的相似之处,但Scala语言中的包更加灵活,实际开发的时候还是尽量使用java包的定义方式并将代码集中进行管理,
这样别人读代码的时候更方便,代码更简洁。包的使用有以下几点:
1.外层包无法直接访问内层包,如果一定要使用的话,可以引入包,
内层包可以访问外层包中定义的类或对象,无需引入
2.scala允许在任何地方进行包的引入,_的意思是引入该包下的所有类和对象
3.包限制,如private[X]、protected[X]表示将访问控制限定到X,X外的无法访问、使用,
这样可以起到隔离的作用,比如框架与程序隔离,如果想使用限制内的类、方法等,
像什么包对象,包里类改名啊等的就不说了,感觉不常用。
2.继承
继承方面能说的也不多,学过java不说也理解 -_-! 能说的也不多。想到再补充吧
3.蘑菇云代码
package com.dt.scala.moguyun
/**
* DT_Spark
* 类继承时属性覆盖的问题
* Sporter修改了Person中的字段counter,而counterArray用到counter来定义Array
* 这时的counter是多少?提前定义
*/
object OverrideField {
def main(args: Array[String]): Unit = {
val s = new Sporter
/*
new Sporter实例化时,先构造Person类,这时开始counter = 3,但是Sporter重写了counter,
而Person没有实例化,那么counter就是默认值为0,然后实例化new Array[Int](counter)长度就为0,
接着实例化Sporter,这时counter = 5,不过已经晚了。要验证也简单,把override val counter = 5
注释掉,看结果
*/
println(s.counterArray.length)//结果为0
}
}
class Person {
val counter = 3
println("Person: counter = " + counter)
val counterArray = new Array[Int](counter)
}
class Sporter extends Person {
// override val counter = 5
println("Sporter: counter = " + counter)
}
class Programmer(val name: String, val salary: Double) {
final override def equals(other: Any) = {
val that = other.asInstanceOf[Programmer]
if (that == null) false
else name == that.name && salary == that.salary
}
override def hashCode(): Int = name.hashCode() * 17 + salary.hashCode() * 9
}
结果
把override val counter = 5 注释前
Person: counter = 0
Sporter: counter = 5
0
注释后
Person: counter = 3
Sporter: counter = 3
3
要解决这问题的办法就是提前定义,不过样子不好看,完整代码如下:
package com.dt.scala.moguyun
/**
* DT_Spark
* 类继承时属性覆盖的问题
* Sporter修改了Person中的字段counter,而counterArray用到counter来定义Array
* 这时的counter是多少?提前定义
*/
object OverrideField {
def main(args: Array[String]): Unit = {
val s = new Sporter
/*
new Sporter实例化时,先构造Person类,这时开始counter = 3,但是Sporter重写了counter,
而Person没有实例化,那么counter就是默认值为0,然后实例化new Array[Int](counter)长度就为0,
接着实例化Sporter,这时counter = 5,不过已经晚了。要验证也简单,把override val counter = 5
注释掉,看结果
*/
println(s.counterArray.length)//结果为0
}
}
class Person {
val counter = 3
println("Person: counter = " + counter)
val counterArray = new Array[Int](counter)
}
/*
class Sporter extends Person {
override val counter = 5
println("Sporter: counter = " + counter)
}
*/
class Sporter extends {
override val counter = 5
} with Person
class Programmer(val name: String, val salary: Double) {
final override def equals(other: Any) = {
val that = other.asInstanceOf[Programmer]
if (that == null) false
else name == that.name && salary == that.salary
}
override def hashCode(): Int = name.hashCode() * 17 + salary.hashCode() * 9
}
以上内容来自[DT大数据梦工厂]首席专家Spark专家王家林老师的课程分享。感谢王老师的分享,更多精彩内容请扫描关注[DT大数据梦工厂]微信公众号DT_Spark