Scala讲座:类定义和构造函数

发表于:2011-8-31 14:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:fineqtbull    来源:51Testing软件测试网采编

  序言

  到这为止牛尾先生作了一下Scala语言的介绍,接下来以微型旅游的形式做一下有关Scala语法特点的探险。如果是初次接触的读者可以大略的读一下第一和第二回的讲座,就可以顺畅地读懂本文了。

  这次旅行准备访问的是,类定义和构造函数;混合Scala与Java程序以及与Java语言在语法上的差别;称为特征(Trait)的mixin型多重继承;函数定义和函数式编程;类型层次和集合;模式匹配;XML文本操作;等主题。

  首先,作为复习我们先整理一下Scala语言的要点。

  ● 事实1:Scala中可以简单使用所有Java类,Java中也可以自由调用Scala类。Scala类还可以定义为Java类的子类。也就是说,庞大的已有Java、J2EE、Java ME和CLDC资源可以被更有效和合理地应用了。(在Net上,虽然现在的版本还不支持,1.x版曾经支持过,将来也有复活的计划)

  ● 事实2:Scala在JVM上被执行,编译后的代码执行性能基本与Java代码不相上下。结果是比大多数脚本语言的速度都快一位数以上。

  ● 事实3:Scala一方面是纯面向对象的语言,另一方面在这框架中提供了完全的函数式编程的功能。Scala的所有数据都是对象,函数也是对象,可以作为数据来操作。

  ● 事实4:Scala在对于开发Javac和Java Generics有贡献的Martin Ordersky教授所率领的强大的开放体制下被开发,不是实验室的实验品,而是将来可以期待的通用编程语言。Scala发布的频率非常快,文档也很丰富,现在的版本是Scala2.7.1 final(2008/8)。

  类定义和构造函数

  那么,定义一下类吧。首先定义一下在语言介绍中一直用到的Person类。首先是Java类

  • 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写的同样内容

  • class Person(fn : String, ln : String, s : Person)  
  • {  
  • val lastName = ln; //没有private修饰符则认为是public 
  • val firstName = fn; //从构造函数的参数类型推断为String 
  • var spouse = s; //从构造函数的参数类型推断为Person 
  • def this(fn : String, ln : String) = { this(fn, ln, null); }  
  • def introduction() : String =  
  • return "我的名字是, " + lastName + " " + firstName +  
  • (if (spouse != null" 对方的名字是, " + spouse.lastName + " " + spouse.firstName + "。" else "。");  
  • }
  •   从行数来看大概缩短为1/3,代码变得非常简洁了。用val来定义常量,var来定义可再赋值的实例属性。用def来定义方法。Scala的目的之一就是使书写的代码更简洁易读。

    31/3123>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号