样例类的基本介绍和使用 | 学习笔记

简介: 快速学习样例类的基本介绍和使用

开发者学堂课程【Scala 核心编程 - 进阶样例类的基本介绍和使用学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9080


样例类的基本介绍和使用


样例类

1、样例类快速入门

样例类非常重要,使用的情况非常多,java里面克隆属于样例类

样例在某种程度上可以理解为模板,样例(模板)类,当创建一个样例的时候有很多方法提供,有很多情况下有些方法是拥有的,因此设计样例类 (case)

我们生成了样例类其中有很多重要的方法,如 toString 、 hashCode 、 copy 、 apply 、 unapply 方法,在一定程度上减轻程序员重复性的工作。

abstract class Amount

case class Dollar(value: Double) extends Amount

case class Currency(value: Double,unit: String) extends Amount

case object NoAmount extends Amount

说明:这里的 Dollar,Currencry, NoAmount 是样例类。

案例演示+反编译

案例里面有一个抽象类 Amount 然后样例类叫Dollar美元,美元有一个构造器,传一个值就构建一个美元的对象,继承了amount,这就是一个样例类,样例后面是空的,所以两个大括号可以去掉。

例如:

class Dog{

}

假设 Dog 里面没有任何内容,大括号是可以去掉的。

如:class Dog

Dollar 里面已经写了一个构造器,这个构造器它会默认生成。

但是例如:

class Cat (name:String)

写了一个 name:String  ,会默认实现一个机制。

class Cat (var name:String) 默认把那 name 交给可读的属性。

Currency 货币,做了一个扩展首先传一个货币的金额和金额的单位同样继承 amount也是一个样例类。

样例不但可以写在 case 上也可以写在 object 上,两者有一点区别,源代码 object 生成的样例类方法较少。

新建 CaseClassDemo01 文件

package com.atguigu.chapter12

object CaseclassDemo01 {

def main(args:  Array[String]) : Unit= {

println(“hello~~”)

}

}

Abstract class Amount

case class Dollar(value: Double) extends Amount  //样例类( value 默认直接当成属性,没有 case value 就是一个局部变量)

case class Currency(value: Double, unit: string) extends Amount  //样例类

case object NoAmount extends Amount  //样例类(与 class 有区别)

直接运行产生样例类:

D:\program\jdk8\bin\java ...

hello~~

Process finished with exit code θ

如果没有加 case ,Dollar 在底层只能呈现一个 Dollar.class,但是样例类会生成两个文件 Dollar.class 和 Dollar$.class , Currency 也对应两个

新建一个 New Package 为 casepak把 CaseClassDemo01 放进去

找到 Administrator - IdeaProgects - java0705scala - target - classes - com - atguigu - chapter12 - casepak

名称

Amount.class            

CaseCiassDemo01$.class  

CaseClassDemo01.class (本身运行程序)    

Currency$.class            

Currency.class            

Dollar$.class              

Dollar.class

NoAmount$.class

NoAmount.class

class对应两个文件,打开 Dollar.class

package com.atguigu.chapter12.casepak;

import scala.Functionl;

◎ScalaSignature(bytex=”\006\001\005Ua\001B\001\003\001.\021a\001R8mY\006\024(BA\002\005\003\035\031\027m] 3qC.T!!\002\004\002\023\

public class Dollar extends Amount

implements Product, Serializable  (实现了一个product,Serializable也序列化)

{

private final double value;

public static Option<Object> unapply(Dollar paramDollar) ;

{

return Dollar.MODULE$.unapply(paranDollar);

}

public static Dollar apply(double paramDouble)

{

return Dollar..MODULE$.apply(paramDouble);

}public static <A> Function1<Object, A> andThen(Function1<Dollar, A> paramfunction1)

{

return Dollar..MODULES.andThen(paramFunction1);

}public static <A> Function1<A, Dollar> compose(Function1<A, Object> paramFunction1)

{

return Dollar.. MODULE$.compose(peramfunction1);

}

public double value()

{

return this.value;) public Dollar copy(double value) ( return new Dollar(value); ) ( copy 两个方法可以返回默认值)

public double copy$default$1()( return value (); )

public String productPrefix() {return "Dollar"; }

public int productArity() { return 1; }public Object productElement(int x$1) { int i = x$1; switch (i) { default:throw new IndexOutOfBoundsException(BoxesRunTime.boxToInteger(x$1).toString());

case 0:} return BoxesRunTime.boxToDouble(value());}

publicIterator<Object>productIterator(){ returnScalaRunTime..MODULE$.typedProductIterator(this);}public boolean canEqual(Object x$1) { return x$1 instanceof Dollar; }public int hashCode() { int i = -889275714 ; i=Statics.mix(i, Statics.doubleHash(value())); return Statics.finalizeHash(i, 1);public String toString() { return ScalaRunTime..MODULE$._toString(this); }

public boolean equals(0bject x$1)    ( 有 hashCode、toString、equal功能可以进行对象之间的比较)

{

Dollar localDollar;

if (this != x$1) { Object localObject=x$1;

int i;if((localObject instanceof Dollar)) i =1: else i =0:;if (i == 0) break label65; localDollar= (Dollar)x$1; }label65: ret

public Dollar(double value){ Product.class.$init$(this);}

}

打开Dollar$.class

package com.atguigu.chapter12.casepak;

import scala.None.;public final class Dollar$ extends AbstractFunction1<object, Dollar>

implements Serializable

{

public static final MODULE$;

Static

{

new ();

}

public final String tostring()

{

return "Dollar";}

public Dollar apply(double value) { return newDollaz(value);}public 0ption<Object> unapply(Dollar x$0) { return x$0 == null ? None..MODULE$ : new Some (BoxesRunTime.boxToDouble(x$0.value()));

private Object readResolve() { return MODULE$; }

private Dollar$() { MODULE$ = this; }

}

从其中可以看出来样例能生成很多方法

2.样例类基本介绍

1)样例类仍然是类(大前提,样例类里面仍可以写东西)

2)样例类用 case 关键字进行声明(只要含有 case 就是样例类)

3)样例类是为模式匹配而优化的类

4)构造器中的每一个参数都成为 val --除非它被显式地声明为 var (不建议这样做)

5)在样例类对应的伴生对象中提供 apply 方法让你不用 new 关键字就能构造出相应

的对象

6)提供 unapply 方法让模式匹配可以工作 (把样例类和对象提取器结合使用)

7)将自动生成 toString 、equals 、hashCode 和 copy 方法(有点类似模板类,直接给生成,供程序员使用)

8)除上述外,样例类和其他类型完全一样。你可以添加方法和字段,扩展它们

相关文章
|
7月前
|
SQL JSON 数据库
技术笔记:mysqlidb类的使用方法汇总
技术笔记:mysqlidb类的使用方法汇总
62 0
|
8月前
|
存储 数据安全/隐私保护 C++
C++零基础教程(C++中的类)
C++零基础教程(C++中的类)
48 0
|
8月前
|
编译器 C++
C++零基础教程(C++中的类1)
C++零基础教程(C++中的类1)
76 0
|
8月前
|
存储 数据安全/隐私保护 C++
C++零基础教程(C++的类2)
C++零基础教程(C++的类2)
58 0
|
C语言 C++
【C++】类的简介
【C++】类的简介
200 0
|
Scala 开发者
类型匹配的基本介绍和使用 | 学习笔记
快速学习类型匹配的基本介绍和使用
类型匹配的基本介绍和使用 | 学习笔记
|
存储 网络协议 测试技术
文件的基本介绍 | 学习笔记
快速学习文件的基本介绍
文件的基本介绍 | 学习笔记
|
Scala 开发者
对象匹配基本介绍和快速入门 | 学习笔记
快速学习对象匹配基本介绍和快速入门