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

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

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

相关文章
|
存储 Oracle Java
JVM中Class文件结构详解
JVM中Class文件结构详解
259 0
|
分布式计算 Java Hadoop
Scala入门必刷的100道练习题(附答案)
Scala入门必刷的100道练习题(附答案)
1032 1
|
API Apache 流计算
Flink在保存savepoint时出现超时错误
Flink在保存savepoint时出现超时错误【1月更文挑战第6天】【1月更文挑战第28篇】
474 1
|
JavaScript Java 应用服务中间件
centos部署vue项目(java,tomcat环境的搭建)
centos部署vue项目(java,tomcat环境的搭建)
285 0
|
数据采集 存储 前端开发
【爬虫pyspider教程】1.pyspider入门与基本使用
爬虫框架pyspider入门和基本用法。
2040 0
|
数据采集 存储 SQL
基于Apache doris的元数据管理系统
什么是元数据?元数据和数据的区别是什么?元数据有什么作用。
1706 0
基于Apache doris的元数据管理系统
|
JSON 安全 数据安全/隐私保护
Refresh Token的使用场景以及如何与JWT交互
在这篇文章中,我们将探索由OAuth2定义的Refresh Token的概念。我们将会明白为什么他们会这样做,以及他们如何与其他类型的Token进行比较。我们也将通过一个简单的例子来学习如何使用它们。
18651 0
|
JavaScript Java 测试技术
基于小程序的家政服务管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的家政服务管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
375 59
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML和CSS之旅
【9月更文挑战第32天】在这个数字化的时代,拥有一个个人博客不仅是展示自我的平台,也是技术交流的桥梁。本文将引导初学者理解并实现一个简单的个人博客网站的搭建,涵盖HTML的基础结构、CSS样式的美化技巧以及如何将两者结合来制作一个完整的网页。通过这篇文章,你将学会如何从零开始构建自己的网络空间,并在互联网世界留下你的足迹。
|
人工智能
阿里国际站推出AI极简出海计划
【2月更文挑战第19天】阿里国际站推出AI极简出海计划
395 1
阿里国际站推出AI极简出海计划