开发者学堂课程【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)除上述外,样例类和其他类型完全一样。你可以添加方法和字段,扩展它们