scala编程04--定义类

本文详细介绍了Scala编程中类的定义和使用,包括面向对象和过程的特性,函数与方法的区别,类的创建,getter与setter方法的自定义与控制,以及辅助构造函数和内部类的用法。同时,探讨了private[this]的作用以及如何生成Java风格的getter和setter。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、scala是面向对象,也是面向过程的。就是可以传函数。在java中,要想传函数,一般就是封装到一个类里,传一个匿名内部类。scala的函数是一级成员,可以定义一个函数,传到另外一个函数里
2、函数:类外边定义的def
方法:类内定义的def
注意:如果定义时的def后的方法名没加(),在调用的时候就不能加();定义def的方法名加了()调用时,可以加()也可以不加()
3、定义一个简单的类:
在这里插入图片描述
测试类:在这里插入图片描述
得结果为:在这里插入图片描述
4、getter与setter方法
(1)由var定义的变量可生成getter和setter方法
在这里插入图片描述
在这里插入图片描述
(2)由val定义的变量只可生成getter方法,不可以修改
在这里插入图片描述
在这里插入图片描述
(3) 定义不带private的var field,此时scala生成的面向JVM的类时,会定义为private的name字段,并提供public的getter和setter方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)如果使用private修饰field,则生成的getter和setter也是private的

5、自定义getter与setter:如果希望自己可以对getter与setter进行控制,注意语法限制,签名、=、参数间不能有空格。
在这里插入图片描述
注意:def name是新定义的getter方法
def name_是新定义的setter方法
在这里插入图片描述
在这里插入图片描述
6、仅暴露field的getter方法:如果希望仅仅暴露一个getter方法,并且还能通过某些方法更改field的值,那么需要综合使用private以及自定义getter方法,此时,由于field是private的,所以setter和getter都是private,对外界没有暴露;自己可以实现修改field值的方法;自己可以覆盖getter方法。
在这里插入图片描述
在这里插入图片描述
注意:当newname=leo1时不报错,但是也不可以修改值,当newname=其他值时就会走else的语句
在这里插入图片描述
7、private[this]的使用:如果将field使用private来修饰,那么代表这个field是类私有的,在类的方法中,可以直接访问类的其他对象的private field,这种情况下,如果不希望field被其他对象访问到,那么可以使用private[this],意味着对象私有的field,只有本对象内可以访问到
在这里插入图片描述
在这里插入图片描述
使用private[this]的时候会报错:
在这里插入图片描述
在这里插入图片描述
8、Java风格的getter和setter方法: Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式,如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可,此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unit
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一种方式为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
9、辅助constructor:Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载, 辅助constructor之间可以互相调用,而且必须第一行调用主constructor
在这里插入图片描述
10、主constructor:在scala中主constructor是与类名放在一起的,且在类中没有定义在任何方法或者是在代码块之中的代码,就是主constructor,主constructor中还可以通过使用默认参数,来给参数默认的值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意: 如果主constrcutor传入的参数什么修饰都没有,比如name: String,那么如果类内部的方法使用到了,则会声明为private[this] name;否则没有该field,就只能被constructor代码使用而已
11、内部类:Scala中,同样可以在类中定义内部类;但是与java不同的是,每个外部类的对象的内部类,都是不同的类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值