大数据Scala系列之类

简介: 大数据Scala系列之类类的定义Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。如果没有指定访问修饰符符,默认情况下,Scala 对象的访问级别都是 public。

大数据Scala系列之类

  1. 类的定义

Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。

如果没有指定访问修饰符符,默认情况下,Scala 对象的访问级别都是 public。

私有(Private)成员

用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。

class Outer{

class Inner{
private def f(){println("f")}
class InnerMost{
    f() // 正确
    }
}
(new Inner).f() //错误

}

(new Inner).f( ) 访问不合法是因为 f 在 Inner 中被声明为 private,而访问不在类 Inner 之内。

但在 InnerMost 里访问 f 就没有问题的,因为这个访问包含在 Inner 类之内。

Java中允许这两种访问,因为它允许外部类访问内部类的私有成员。

保护(Protected)成员

在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问。

package p{
class Super{

protected def f() {println("f")}
}
class Sub extends Super{
    f()
}
class Other{
    (new Super).f() //错误
}

}

类的定义示例:

//定义Point类,构造器带有两个参数
class Point(var x: Int, var y: Int) {

//无返回值的类方法

def move(dx: Int, dy: Int): Unit = {

x = x + dx
y = y + dy

}

//没有参数但是返回值为String类型的重写方法

override def toString: String =

s"($x, $y)"

}

//创建类的实例
val point1 = new Point(2, 3)
point1.x // 2
println(point1) // prints (2, 3)

构造器可以带有默认值:

class Point(var x: Int = 0, var y: Int = 0){
...
}
val origin = new Point // x, y都取默认值0
val point1 = new Point(1)//x=1,y=0
println(point1.x) // prints 1

私有成员变量以及重新定义的Getter/Setter方法:

private var _x = 0
private var _y = 0
private val bound = 100

def x = _x
def x_= (newValue: Int): Unit = {

if (newValue < bound) _x = newValue else printWarning

}

def y = _y
def y_= (newValue: Int): Unit = {

if (newValue < bound) _y = newValue else printWarning

}

private def printWarning = println("WARNING: Out of bounds")
}

val point1 = new Point
point1.x = 99
point1.y = 101 // prints the warning

类定义中的其他细节:

//在Scala中,类并不用声明为public。
//Scala源文件中可以包含多个类,所有这些类都具有公有可见性。
class Person {
//用val修饰的变量是只读属性的,只带getter方法但没有setter方法
//(相当与Java中用final修饰的变量)
//字段必须初始化
val id = "1234"

//用var修饰的变量,默认同时有公开的getter方法和setter方法
var age: Int = 18

//类私有字段,有私有的getter方法和setter方法,只能在类的内部使用
private var name: String = "王老五"

//对象私有字段,访问权限更加严格的,Person类的方法只能访问到当前对象的字段
private[this] val hobby = "旅游"
}

scala中,在实现属性时你有如下四个选择:

var foo: Scala自动合成一个getter和一个setter

val foo: Scala自动合成一个getter

由你来定义foo和foo_=方法

由你来定义foo方法

  1. 构造器
    注意:

1.主构造器会执行类定义中的所有语句

2.主构造器如果有参数直接放置在类名之后

class ConstructorDemo ( val id: Int ) { … }

3.主构造器变成私有的,可以像这样放置private关键字:

class ConstructorDemo private ( val id: Int ) { … }

此时,用户必须通过辅助构造器来构造Person对象

class ConstructorDemo {

private var var1 = ""

private var var2 = 0

//辅助构造器1
def this(var1:String) {

this()  //调用主构造器
this.var1 = var1

}

//辅助构造器2
def this(var1:String, var2:Int) {

this(var1) //调用辅助构造器1
this.var2 = var2

}

}

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
453 0
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
579 0
|
Java 大数据 数据库连接
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
377 2
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
|
Java Scala
Scala 类和对象
Scala 类和对象
311 5
|
消息中间件 存储 druid
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
391 3
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
572 0
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
439 0
|
分布式计算 算法 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
429 0
|
机器学习/深度学习 传感器 分布式计算
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
数据才是真救命的:聊聊如何用大数据提升灾难预警的精准度
766 14
|
机器学习/深度学习 运维 监控
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
运维不怕事多,就怕没数据——用大数据喂饱你的运维策略
1240 0