您的位置:首页 > 大数据

大数据系列修炼-Scala课程06

2016-08-09 14:02 459 查看
核心内容:

1、Scala类的使用实战

2、getter与setter实战

3、对象私有属性

1、Scala类的使用实战
(1)Scala中的类默认是public级别的,如果用户添加public修饰符,将会报错

(2)Scala中的属性默认是private级别的,Scala中的方法默认是public级别的.

(3)类中的属性必须被赋值,否则会报错

示例程序:

class Student             //类默认是public级别的
{
val name = "zhangsan"  //属性默认是private级别的
var score = 60.0
def fun()              //方法默认是public级别的
{
println(name+"\t"+score)
}
}


上面的Scala程序等同于下面的Java程序,很明显Java程序显得稍微复杂一点:

class Student
{
private String name = "zhang";
public  double score = 60.0;
public void fun()
{
System.out.println(name+"\t"+score);
}
}


2、getter与setter实战
(1)类中的var属性自动带有getter方法和setter方法

(2)getter方法和setter方法默认是共有的,但是如果属性加上了private修饰符(尽管字段本身已经是private了),则getter方法和setter方法将会变成私有的

(3)用户可以自行定义类setter方法和getter方法的函数

(4)被val修饰的属性,在底层是final类型的private字段,只有getter方法,没有setter方法(符合我们在Java中学的:被final修饰的属性,一旦被赋值,数值将不能被修改,同时也符合Scala中的val永不改变的规定)

示例程序1:用户没有对属性加上private修饰符,此时getter方法与setter方法默认是共有的

object App6
{
def main(args:Array[String]):Unit=
{
val aa =  new Student()
aa.score = 80.0     //实际上调用的是setter方法设置的score数值
println(aa.score)   //实际上调用的是getter方法获取的score数值
}
}
class Student
{
var score = 60.0  //类中的属性默认是private级别的,私有成员在类的外部是不能被访问的
}


示例程序2:用户对属性加上了private修饰符,此时getter方法与setter变成私有的了,为了能够访问私有属性,我们需要自行定义类似setter方法和getter方法的函数

object App6
{
def main(args:Array[String]):Unit=
{
val aa =  new Student()
/***aa.score = 80.0
println(aa.score)***不能在这么写了***/

aa.setter(88.0)
println(aa.getter())
}
}
class Student
{
private var score = 60.0  //此时默认的getter方法与setter变成私有的了,在类的外部将不能被使用
//自定义类似setter与getter的函数(名字可以任意取值)
def setter(score:Double)=
{
this.score = score
}
def getter()=score
}


示例程序3:被val修饰的属性,只有getter方法,没有setter方法

object App6
{
def main(args:Array[String]):Unit=
{
val aa =  new Student()
println(aa.name)    //实际调用的是aa对象的getter方法
//aa.name = "lisi" -->如果这样写将会报错,因为被final修饰的属性数值不能发生改变
}
}
class Student
{
val name = "zhang"
}


3、对象私有属性实战
(1)在scala中,在一个类的内部,所有的成员彼此之间都可以进行相互访问,共有的可以访问私有的,私有的可以访问共有的,因为大家是一家人嘛

(2)在一个类的外部,通过类对象名.私有成员名的方式是不能访问类的私有成员的,但是在一个类的内部,通过类对象名.私有成员名的方式是可以访问类的私有成员的(这句话等同于在一个类的内部,方法是可以访问这个类所构造的对象的私有成员的)

(3)通过使用private[this]修饰符,将会导致在一个类的内部,通过类对象名.私有成员名的方式是不可以访问类的私有成员的,这是一种更加严格的访问限制(这句话等同于通过使用private[this]修饰符,将会导致在一个类的内部,方法是不可以访问这个类所构造的对象的私有成员的)—->这种情况叫做对象私有属性

(4)在Spark中,在属性配置或驱动生成的时候常用对象私有属性机制,通过使用private[this]这种机制,可以很好的进行实例成员的隔离.

(5)private[this]只可以被当前类的对象本身使用,不可以被当前类的方法使用。

示例程序1:在一个类的内部,方法是可以访问这个类所构造的对象的私有成员的(不加private[this])

class Student
{
val name = "zhang"
def fun(aa:Student)
{
println(aa.name) //私有属性在类的内部是可以通过类对象名.私有成员名的方式进行访问的
}
}


示例程序2:通过使用private[this]修饰符,将会导致在一个类的内部,方法是不可以访问这个类所构造的对象的私有成员的

class Student
{
private[this] val name = "zhang"
def fun(aa:Student)
{
//报错:println(aa.name)
//原因:通过使用对象私有属性机制,将会导致私有属性在类的内部不可以通过类对象名.私有成员名的方式进行访问的
}
}


如有问题,欢迎留言指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: