---恢复内容开始---

随笔记录scala中,有哪些类,如何定义一个类,有哪些注意点。

一,scala中有哪些类?

1,简单类 class

2,单例模式 object

3,伴生类

4,case class

5,trait

二,如何定义一个类

import java.io._

class Point(xc: Int, yc: Int) {
var x: Int = xc
var y: Int = yc def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("x 的坐标点: " + x);
println ("y 的坐标点: " + y);
}
} object Test {
def main(args: Array[String]) {
val pt = new Point(10, 20); // 移到一个新的位置
pt.move(10, 10);
}
}

上面是最基本的类定义方法,定义类的时候可以选择有参数,也可以选择没有参数,相当于java中的构造方法。

需要注意的是:1,类的参数可以是具体的类型参数也可以是泛型;2,类的参数默认是不可变的,如果类的参数需要更改可以设定累的参数为var型。代码:

//这里的类的参数直接使用泛型,我们当然可以把T1,T2换成任意我们想要的类型,比如Int,Double,String,Seq,Map等等。
class ClassTest[T1,T2,T3](var t1:T1,val t2:T2,t3:T3) {//注意到前两个参数有var、val的标记,第三个没有
def setT1(st1:T1) = {t1 = st1}
def setT2(st2:T2) = {t2 = st2}//编译报错,显示"reassignment to val",意为:不可对val进行重赋值
def setT3(st3:T3) = {t3 = st3}//编译报错,显示"reassignment to val",意为:不可对val进行重赋值
println(t1.toString)
println(t2.toString)
println(t3.toString)
}
object ClassTest{
def main(args: Array[String]): Unit = {
val ct = new ClassTest(123,"John",1.2345)
// ct.setT1(234)
// ct.setT2("Joris")
// println(ct.t1)
// println(ct.t2)
println("end object")
}
}

关于类的构造方法(与Java类比),对于泛型参数类型的说明见后面的注意,简单参数类型类的说明参见:scala的构造方法与继承,下面是对原文的摘录。

有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代码中的辅助构造函数:

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

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

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

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

注意:我们看到scala中的副构造函数必须调用主构造函数,

scala-类的更多相关文章

  1. Scala类基础

    最近在开始学习Scala,本篇文章我们来讲解一下Scala中类的使用 class Counter { var defaultValue = 0 val valValue = 0 private var ...

  2. Scala 类和对象

    Scala class: Scala 源文件中可以有很多类(class),这些类默认都是Public的,public是Scala的默认访问级别.在Scala中,声明一个未用priavate修饰的字段 ...

  3. Scala类的构造器与访问器

    1.构造器 在Scala中,每个类都有一个主构造器.主构造器与类的定义交织在一起,如下: class Person ( private var _name: String, private var _ ...

  4. Scala类与对象

    类简介 简介 类是对象的蓝图.一旦你定义了类,就可以用关键字new根据类的蓝图创建对象.在类的定义里,可以放置字段和方法,这些被笼统地称为成员.对于字段,不管是val还是var定义的,都是指向对象的变 ...

  5. Spark记录-Scala类和对象

    本章将介绍如何在Scala编程中使用类和对象.类是对象的蓝图(或叫模板).定义一个类后,可以使用关键字new来创建一个类的对象. 通过对象可以使用定义的类的所有功能. 下面的图通过一个包含成员变量(n ...

  6. 【scala】 scala 类 (五)

    1.scala类 1.class 关键字 2.var 属性 默认生成getter/setter 方法 3.val 属性 默认生成getter 方法 4. 自定义getter /setter 方法 , ...

  7. Scala类中的get与set

    在scala类中get和set使用有以下几种: 1. var foo: Scala自动合成一个getter和一个setter 2. val foo: Scala自动合成一个getter scala中v ...

  8. Scala实战高手****第9课:Scala类和对象彻底实战和Spark源码鉴赏

    scala类和对象 RDD中创建_sc和deps相比java更加的简洁. 在Spark的例如SparkContext.sqlSpark等全局成员在完成实例化. 在唯一实例的时候一般不会去使用伴生对象a ...

  9. Scala类和对象(二)

    1. 类和属性 1.1 如何控制构造函数字段的可见性 在Scala中: 如果一个字段被声明为var, Scala会为该字段生成getter和setter方法. 如果字段是val, Scala只生成ge ...

  10. scala学习手记4 - Java基本类型对应的scala类

    在Java中变量类型分为两大类:基本类型和引用类型.虽然在JDK1.5以后引入了自动装箱和自动拆箱机制,大大减少了我们在直接类型和引用类型之间的纠结,但仍有一些我们不得不考虑的问题.比如我在工作遇到的 ...

随机推荐

  1. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  2. TCP和UDP之间的区别和联系

    面向连接的TCP TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接.一个TCP连接必须要经过三次 ...

  3. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

  4. Android广播机制的深入学习

    部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...

  5. How Garbage Collection Really Works

    Java Memory Management, with its built-in garbage collection, is one of the language's finest achiev ...

  6. Android Studio 高级配置

    http://liukun.engineer/2016/04/10/Android-Studio-advanced-configuration/

  7. SQL Server 维护计划实现数据库备份(Step by Step)(转)

    SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server  ...

  8. selenium查找动态的iframe的name

    WebElement frame1 = driver.findElement(By.xpath("/html/body/div[9]/div[2]/div/iframe"));dr ...

  9. jQuery MiniUI开发系列之:使用API文档

    jQuery MiniUI在组件设计上,是简约.独立的,没有复杂的继承体系. 比如使用DataGrid,可以在api文档的datagrid部分,查找到datagrid的所有属性.方法.事件,而无需关注 ...

  10. [delphi]indy idhttp post方法

    网易 博客 LOFTCam-用心创造滤镜 LOFTER-最美图片社交APP 送20张免费照片冲印 > 注册登录  加关注 techiepc的博客 万事如意 首页 日志 LOFTER 相册 音乐 ...