scala第二天补充(类)

1,类的定义

scala类定义使用class关键字,如果我们如果写scala脚本或者使用开发工具一般都是需要定义一个类来开头的

class abc(){
var a=0;
def agg()={
a+=1
}
}

上面是一个简单的scala类的定义,首先类中的变量或者常量都是需要赋予默认值的
还有就是一个scala中可以定义多个类

2,scala类属性的get,set

在java中,我们如果需要取到一个类变量或者赋值可以生成get,set方法。但scala中不需要这么麻烦,只要你定义了变量他就会在你编译的时候自动生成get,set方法,我们看一个案例,我们就按照上面的例子来演示,

 1)我们首先把上面代码写在一个文件中就叫做abc.scala  在当前路径cmd进入命令行,使用scalac abc.scala来编译这个文件,他会生成一个class文件

  2)我们使用我们熟悉的java命令来查看里面的代码详情,javap -private abc.class  参数-private是权限最高的,也就是能看到最多的编译代码,如图:

我们可以看到他已经成功编译成了java代码,然后我们仔细一看上面生成两个特殊方法,a()的方法和一个a_$eq(int)方法,其中a()就是get方法,a_$eq(int)就是set方法,怎么看这个set方法有点别扭,其实我们也可以看成abc_=(int)这个样子,因为java中只能出现_和$符号,所以用$eq来代替=号,还有就是a变量自动转换成private私有类型了

3)下面我们试试把a变量主动设置成private类型看看会发生什么,我们编译,查看,详情如下:

我们可以发现a变量还是私有的,但他的get,set方法也都变成私有了

还有就是把a变量变成常量,我就不做实例了,大家可以试试,那就是只会生成get方法,因为常量的值不能改变所有set方法是不可能生成的

注意:只要在scala中的变量还是常量,最终都会被编译成private修饰,而get,set方法取决于你的修饰符

4)下面我说一下类怎么调用方法和属性

  首先不管是调用属性还是方法都需要创建对象,如果是object就不用,不过我们后面会说
1,创建对象
 var abc=new abc();
2,调用方法:
  abc.方法名()    //调用方法是,如果你定义方法的时候没有带括号,那你调用的时候就不能带,如果写了, 
                   那就随意
3,调用属性
 abc.a   //其实他调用a的get方法
 abc.a_=(10)  //调用a的set方法

如果你想使用java中set,get方法,可以在变量上加上一个注解
@scala.beans.BeanProperty

3,类的构造

类中可以有一个主构造,和多个辅助构造器

 1)主构造

在scala中,每个类都有主构造器,主构造器并不以this(this是辅助构造定义时使用的)方法定义,而是与类交织在一起。
   1,默认主构造定义就是不用定义,只要你定义一个类他就有
   2,带参的主构造函数,他和java不同,scala中的主构造函数可以加参,但我自己挺不愿意这样写的,我们看看他的定义规范,和一些注意事项
     (1) class person(var a:String){}
         class person(val a:String){}
         首先我们定义的不是private修饰的变量和常量,他的原理就是之前的方法一样,var生成get,set, 
         而val值生成get,而且你创建对象的时候必须要传两个参数
     (2) class person(private var a:String){}
         class person(private val b:String){}
        这个和上个的区别就是他们的get,set都是私有的
     (3) class person(a:String)
           而这个就很特别了,因为你既没有val也没有var,但这样却能编译成功,但如果你创建对象的时候没有给他赋值,那么他就不会创建这个字段,如果创建对象时传参了,那么他会把字段定义成val,并只生成一个get方法

其实说了那么多,我都不推荐大家怎么写,我还是建议主构造器就让他空着,以便我们创建空参对象,如果相传参数,可以使用辅助构造,下面我们讲述辅助构造

2)辅助构造

说起辅助构造那就相当的简单了
1,辅助构造器的名称为this,(在java中构造函数就要和类名相同,那么当你改类名时就不方便了)
2,每个辅助构造器都必须以先前已定义的其他辅助构造器或者主构造器的调用开始
比如:
class Person{
var name="";
var age=0;
def this(name:String){
  this(); //因为他是第一个辅助构造,所有要调用主构造
  this.name=name
}
def this(age:Int){
this(name);  //这个调用的就是上面那个辅助构造
this.age=age;
}
}
其实也就这些了

4,对象(Object)

scala没有静态方法或者静态字段,你可以用object这个语法结构来达到相同的目的。

我们定义一个object的代码来看看他编译成的内容

object person{
var name="";
}

使用scalac 编译会出现两个文件

person$.class这个文件其实就是一个单例对象,而person中就是我们里面的静态字段了,而但我们给静态字段赋值时,他会先调用单例对象在运行person.scala

5,半生对象

所谓半生对象,就是在一个scala文件中写一个同名的object和class,组合在一些这样他们就可以实现互操作先,比如:

object person{
var name="";

}
class person{
var age=0;
def pr()={
print(person.name+"  "+age)
}
}

注意:  还有就是半生对象不能有构造参数

6,扩充apply方法

 其实在我们绝大使用半生对象调用的都是apply方法,这样就可以减少new:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值