Scala class的构造方法与继承
有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的构造方法与继承的更多相关文章
- scala 学习笔记十二 继承
1.介绍 继承是面向对象的概念,用于代码的可重用性.可以通过使用extends关键字来实现继承. 为了实现继承,一个类必须扩展到其他类,被扩展类称为超类或父类.扩展的类称为派生类或子类. Scala支 ...
- oc36--自定义构造方法在继承中的表现
// // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...
- 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解
第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 一. 引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类 ...
- JAVA构造方法,继承关系和SUPER关键字
SUPER可调用父类的构造方法,但要注意默认调用和参数调用. 同时,在继承类时,可以用SUPER调用其它非构造方法哟. class Test extends Object{ public Test() ...
- 05 面向对象:构造方法&static&继承&方法 &final
构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...
- scala学习手记13 - 类继承
在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...
- Scala 系列(九)—— 继承和特质
一.继承 1.1 Scala中的继承结构 Scala 中继承关系如下图: Any 是整个继承关系的根节点: AnyRef 包含 Scala Classes 和 Java Classes,等价于 Jav ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
- Scala学习之路 (六)Scala的类、对象、继承、特质
一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...
随机推荐
- 问:Linux下Chrome标题栏中文乱码
From:http://blog.csdn.net/loveaborn/article/details/29579787 在使用Linux的时候你会遇到一些奇奇怪怪的问题,不过,你会在解决这些问题的过 ...
- 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布
文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...
- ✡ leetcode 168. Excel Sheet Column Title 26进制数字 --------- java
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- tomcat 清理日志
clear_log.sh #!/bin/bash #clear tomcat logs #log size (1M bytes),if lt, clear LOG_FILE_SIZE=1024000 ...
- stl 初步的使用
1.sort 和 lower_bound 例如 marble https://uva.onlinejudge.org/index.php?option=com_onlinejudg ...
- .NET Core On Mac 第一步,配置环境
话说.NET Core出来这么久了,也没搞搞,实在是羞愧难当啊.既然选择了开始那就不能半途而废啊..NET 跨平台了,那我就用Mac试试吧. 安装步骤一:安装Homebrew 其中会遇到权限不够的问题 ...
- IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)
IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!) 1. -----------自动代码-------- 常用的有fori/sout/psvm+Tab即可生成循环.System.ou ...
- 关于初次使用Verilog HDL语言需要懂的基本语法
关于初次使用Verilog HDL语言需要懂的基本语法 1.常量 数字表达式全面的描述方式为:<位宽><进制><数字> 8’b10101100,表示位宽为8的二进制 ...
- linux下socket编程-进程间通信
一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...
- SpringMVC学习系列(5) 之 数据绑定-2
在系列(4)中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法. 1.@PathVariable 用来绑定URL模板变量值,这个我们已经在系列(3) ...