scala 继承java类_Scala class的构造方法与继承

有java背景的人,很清楚java是如何定义构造方法以及继承的。在scala里面,继承和java有些相似。但是构造方法的定义,就不大一样了,应该说是差别还是很大的。在java里面,定义构造方法,就是定义一个没有返回值类型的与类同名的方法。

如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.shihuc;2

3 public classPerson4 {5 private String lastName; //姓

6 private String firstName; //名

7 private Person spouse; //配偶的Person对象

8 publicPerson(String fn, String ln, Person s)9 {10 lastName = ln; firstName = fn; spouse =s;11 }12 publicPerson(String fn, String ln)13 {14 this(fn, ln, null); //未婚时没有配偶

15 }16 publicString getFirstName()17 {18 returnfirstName;19 }20 publicString getLastName()21 {22 returnlastName;23 }24 publicPerson getSpouse()25 {26 returnspouse;27 }28 public voidsetSpouse(Person p)29 {30 spouse =p;31 }32 publicString introduction()33 {34 return "我的名字是," + firstName + " " + lastName +

35 (spouse != null ?

36 " 对方的名字是," + spouse.firstName + " " + spouse.lastName + " 。":37 " 。");38 }39 }

View Code

但是,scala里面,可以看到:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagelession22

3 classPerson(fn: String, ln: String, s: Person){4 val firstname =fn5 val lastname =ln6 var suporse =s7

8 println("primary constructor")9

10 def this(fn : String, ln : String) {11 this(fn, ln, null)12 }13

14 println("I am testing code")15

16 def introduction() : String ={17 return "我的名字是, " + lastname + " " + firstname +

18 (if (suporse != null) {19 " 对方的名字是, " + suporse.lastname + " " + suporse.firstname + "。"

20 }else{21 "。";22 })23 }24 }25

26 object PersonTest{27 def main(args: Array[String]){28 var p = new Person("shihu", "CHENG")29 println(p.introduction())30 }31 }

View Code

虽然scala的写法变得比java简洁了很多,这个是值得表扬的,但是构造函数的定义就有很大的不同。

1. 先说主构造函数,也就是英文资料中说的primary constructor,它是和类的定义混杂在一起的,即定义类的时候,就指明了这个类的成员变量参数,还有,就是在类中,除了def定义的成员函数之外的所有操作,都可以看作是构造函数的行为组成部分,不管是变量赋值还是函数调用。而java的类定义和构造函数的定义是分开的。

2. 再说派生的构造函数,即java中可以定义多个构造函数,这点,在java里非常简单,就是方法的重载呗。但是,在scala里面,要定义多个构造方法,就必须直接或则间接的调用主构造函数。而且调用的时候,必须通过关键字this来操作。正如上面scala代码中的辅助构造函数:

1 def this(fn : String, ln : String) {2   this(fn, ln, null)3 }

需要注意的是,辅助构造函数名必须是this,而且必须调用主构造函数实现参数的传递(直接或则间接,本例子是直接调用,因为只有一个辅助构造函数)。

3. 在scala中,若有继承,那么,只有主构造函数才能将参数的值传递到父类的构造函数中去。

4. 在scala中,若子类继承了父类,但是想在子类中重写父类的某个函数,则在子类中必须用关键字override对父类的函数进行改写, 否则会出现语法错误。要想调用父类的同名函数,可以通过super关键字进行,这点与java是一致的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值