有java背景的人,很清楚java是如何定义构造方法以及继承的。在scala里面,继承和java有些相似。但是构造方法的定义,就不大一样了,应该说是差别还是很大的。在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简洁了很多,这个是值得表扬的,但是构造函数的定义就有很大的不同。

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

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

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

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

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

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

Scala class的构造方法与继承的更多相关文章

  1. scala 学习笔记十二 继承

    1.介绍 继承是面向对象的概念,用于代码的可重用性.可以通过使用extends关键字来实现继承. 为了实现继承,一个类必须扩展到其他类,被扩展类称为超类或父类.扩展的类称为派生类或子类. Scala支 ...

  2. oc36--自定义构造方法在继承中的表现

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...

  3. 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解

    第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类 ...

  4. JAVA构造方法,继承关系和SUPER关键字

    SUPER可调用父类的构造方法,但要注意默认调用和参数调用. 同时,在继承类时,可以用SUPER调用其它非构造方法哟. class Test extends Object{ public Test() ...

  5. 05 面向对象:构造方法&static&继承&方法 &final

    构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...

  6. scala学习手记13 - 类继承

    在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...

  7. Scala 系列(九)—— 继承和特质

    一.继承 1.1 Scala中的继承结构 Scala 中继承关系如下图: Any 是整个继承关系的根节点: AnyRef 包含 Scala Classes 和 Java Classes,等价于 Jav ...

  8. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

  9. Scala学习之路 (六)Scala的类、对象、继承、特质

    一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...

随机推荐

  1. (实用篇)php数组查找函数in_array()、array_search()、array_key_exists()使用

    php在数组中查找指定值是否存在的方法有很多,记得很久以前我一直都是傻傻的用foreach循环来查找的,下面我主要分享一下用php内置的三个数组函数来查找指定值是否存在于数组中,这三个数组分别是 in ...

  2. option对象概念

    一.基础理解: var e = document.getElementById("selectId");   e.options = new Option("文本&quo ...

  3. LeetCode() Repeated DNA Sequences 看的非常的过瘾!

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  4. Bank,我只是来完成作业的

    写这个Bank我需要有:开户,取款,存款,转账,查询余额,退出功能. 这样我需要有两个类:Bank,User.一个Main入口. 先看这个User,他定义了各个需要的属性(字段)和字段的属性(虽然在这 ...

  5. 常见C内存管理程序

    本文主要关注的是C内存管理程序,比较著名的几个C内存管理程序,其中包括: l   Doug Lea Malloc:Doug Lea Malloc实际上是完整的一组分配程序,其中包括Doug Lea的原 ...

  6. 【Unity3D基础教程】给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics

    作者:王选易,出处:http://www.cnblogs.com/neverdie/  欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! Unity3D重要模块的类图 最近刚刚完成了一 ...

  7. ora-01445:无法从不带保留关键字的表的连接视图中选择ROWID或采样

    系统要创建一个物化试图,用到很多张表,执行的时候报错:   ora-01445:无法从不带保留关键字的表的连接视图中选择ROWID或采样   网上搜了下,有多种原因和解决方法,最终我选择先尝试一下修改 ...

  8. Node调试之道-----JSHint

    Node调试之道-----JSHint Node的优势我就不再乱吹捧了,它让javascript统一web的前后台成为了可能.但是对于新手来说,server端的JS代码可能不像client端的代码那么 ...

  9. Charles V4系列更新 | 绿色特别版 | 视频教程

    Charles V4.0 视频教程 http://www.cnblogs.com/weimjsam/p/5841816.html Charles V4系列 绿色特别版,解压密码:博客名 链接: htt ...

  10. Asp.net MVC 之过滤器

    整理一下MVC中的几种过滤器,以及每种过滤器是干什么用的 四种过滤器 1.AuthorizationFilter(授权过滤器) 2.ActionFilter(方法过滤器) 3.ResultFilter ...