scala学习-Scala class的构造方法与继承
2017-08-10 11:18
211 查看
有java背景的人,很清楚java是如何定义构造方法以及继承的。在scala里面,继承和java有些相似。但是构造方法的定义,就不大一样了,应该说是差别还是很大的。在java里面,定义构造方法,就是定义一个没有返回值类型的与类同名的方法。
如下:
但是,scala里面,可以看到:
虽然scala的写法变得比java简洁了很多,这个是值得表扬的,但是构造函数的定义就有很大的不同。
先说主构造函数,也就是英文资料中说的primary constructor,它是和类的定义混杂在一起的,即定义类的时候,就指明了这个类的成员变量参数,还有,就是在类中,除了def定义的成员函数之外的所有操作,都可以看作是构造函数的行为组成部分,不管是变量赋值还是函数调用。而java的类定义和构造函数的定义是分开的。
再说派生的构造函数,即java中可以定义多个构造函数,这点,在java里非常简单,就是方法的重载呗。但是,在scala里面,要定义多个构造方法,就必须直接或则间接的调用主构造函数。而且调用的时候,必须通过关键字this来操作。正如上面scala代码中的辅助构造函数:
需要注意的是,辅助构造函数名必须是this,而且必须调用主构造函数实现参数的传递(直接或则间接,本例子是直接调用,因为只有一个辅助构造函数)。
在scala中,若有继承,那么,只有主构造函数才能将参数的值传递到父类的构造函数中去。
在scala中,若子类继承了父类,但是想在子类中重写父类的某个函数,则在子类中必须用关键字override对父类的函数进行改写, 否则会出现语法错误。要想调用父类的同名函数,可以通过super关键字进行,这点与java是一致的。
如下:
package com.shihuc; public class Person { private String lastName; //姓 private String firstName; //名 private Person spouse; //配偶的Person对象 public Person(String fn, String ln, Person s) { lastName = ln; firstName = fn; spouse = s; } public Person(String fn, String ln) { this(fn, ln, null); //未婚时没有配偶 } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public Person getSpouse() { return spouse; } public void setSpouse(Person p) { spouse = p; } public String introduction() { return "我的名字是," + firstName + " " + lastName + (spouse != null ? " 对方的名字是," + spouse.firstName + " " + spouse.lastName + " 。" : " 。"); } }
但是,scala里面,可以看到:
package lession2 class Person(fn: String, ln: String, s: Person){ val firstname = fn val lastname = ln var suporse = s println("primary constructor") def this(fn : String, ln : String) { this(fn, ln, null) } println("I am testing code") def introduction() : String = { return "我的名字是, " + lastname + " " + firstname + (if (suporse != null) { " 对方的名字是, " + suporse.lastname + " " + suporse.firstname + "。" }else { "。"; }) } } object PersonTest{ def main(args: Array[String]){ var p = new Person("shihu", "CHENG") println(p.introduction()) } }
虽然scala的写法变得比java简洁了很多,这个是值得表扬的,但是构造函数的定义就有很大的不同。
先说主构造函数,也就是英文资料中说的primary constructor,它是和类的定义混杂在一起的,即定义类的时候,就指明了这个类的成员变量参数,还有,就是在类中,除了def定义的成员函数之外的所有操作,都可以看作是构造函数的行为组成部分,不管是变量赋值还是函数调用。而java的类定义和构造函数的定义是分开的。
再说派生的构造函数,即java中可以定义多个构造函数,这点,在java里非常简单,就是方法的重载呗。但是,在scala里面,要定义多个构造方法,就必须直接或则间接的调用主构造函数。而且调用的时候,必须通过关键字this来操作。正如上面scala代码中的辅助构造函数:
1 def this(fn : String, ln : String) { 2 this(fn, ln, null) 3 }
需要注意的是,辅助构造函数名必须是this,而且必须调用主构造函数实现参数的传递(直接或则间接,本例子是直接调用,因为只有一个辅助构造函数)。
在scala中,若有继承,那么,只有主构造函数才能将参数的值传递到父类的构造函数中去。
在scala中,若子类继承了父类,但是想在子类中重写父类的某个函数,则在子类中必须用关键字override对父类的函数进行改写, 否则会出现语法错误。要想调用父类的同名函数,可以通过super关键字进行,这点与java是一致的。
相关文章推荐
- Scala class的构造方法与继承
- Scala学习第十二天 Scala中的继承:超类的构造、重写字段、重写方法代码实战
- List继承体系实现内幕和方法操作源码揭秘之Scala学习笔记-32
- 继承中的构造方法的学习 super在继承中的应用
- Dt大数据梦工厂王家林老师 Scala实战详解之第12讲 Scala中的继承:超类的构造、重写字段、重写方法代码实战
- OC语言学习 (六) 继承、多态,构造方法,description方法
- j2se学习笔记-继承&构造方法
- JavaScript学习笔记(三十二) 经典继承模式二-借用构造方法
- Scala学习之类和属性篇(二):定义类的辅助构造方法
- Ext学习笔记02 - 构造方法,类继承,类实例方法重写
- scala面向对象编程 - 类、抽象类、伴生对象、继承、类的构造方法
- Scala学习之类和属性篇(一):定义类的主构造方法
- scala学习(十三)——带有主构造的继承
- JAVA学习笔记(五)继承时的构造方法、多态、接口、汉诺塔
- 我的Java学习之路2——继承中的构造方法
- Scala 深入浅出实战经典 第12讲:Scala中的继承:超类的构造、重写字段、重写方法代码实战
- Java学习之面向对象(方法的重写 overwrite,super的使用,继承中的构造方法)
- 继承中的构造方法的学习
- Scala中的继承:超类的构造、重写字段、重写方法
- Java学习笔记--继承中的构造方法