开发者学堂课程【Scala 核心编程-基础:作业点评】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8965
作业点评
内容简介
一、类
二、包的引入
一、类
1、编写一个 Time 类,加入只读属性 hours 和 minutes,和一个检查某一时刻是否早于另一时刻的方法 before(other: Time);Boolean。Time 对象应该以 new Time(hrs, min)方式构建。(以24小时制)
题目详解:
加入只读属性的话,这个地方就需要用 val 来进行修饰,方法中传进去的类型也是 time 类型,题目中所提到的“Time对象应该以 new Time(hrs, min)方式构建”说明我们需要提供构造器,构造器可以以主构造器的方式给,也可以以辅助构造器的方式给。
代码设置:
class Time(hrs: Int min: Int){//构造器
val hours: Int = hrs //属性
val minutes: Int = min //属性
def before(other :Time):Boolean ={//方法
if (hours < other. hours){//如果当前的小时数小于other true
else if (hours > other .hours){//如果当前的小时数大于other false
}else{//小时数相等,判断分钟
if (minutes < other. minutes) true else false}
}//这里做了嵌套的分支,如果当前分钟小于其他分钟,还是意味着当前分钟早;否则就变成两个逻辑,大于或者相等,这两种结果都意味着当前分钟晚
val time1 = new Time(11,30)
val time2 = new Time(10,30)
print ln(time1.before(time2))// false
接下来新建包来测试运行代码
代码如下:
package com.atguigu.chapter07.homework
object Exercise01 {
def main(args: Array[string]): unit = {
//测试
val cur = new Time(10,10)
val other = new Time(10,20)
print Ln( cur .before(other)) //
执行结果根据输入的对象不同而定
}
class Time(hrs : Int, min: Int) {//构造器
val hours : Int = hrs //属性
val minutes : Int = min //属性
def before(other: Time): Boolean = {//方法
if (hours < other .hours) {//如果当前的小时数小于other true
}
else if (hours > other .hours) {//如果当前的小时数大于other false
}
else {//小时数相等,判断分钟
if (minutes < other .minutes) true else false
}
执行结果:
true
当改变代码如下时:
val cur = new Time(10,21)
val other = new Time(10,20)
执行结果:
false
当两个时间相同时,执行结果也是 false,代表着前面的时间段还是小于后面的时间段。
2、创建一个 Student 类,加入可读写的 JavaBeans 属性 name(类型为 string)和 id(类型为 Long)。有哪些方法被生产?(用java p查看。)可以在 Scala 中调用 JavaBeans 的 getter 和 setter 方法吗?
(1)题目详解:
JavaBeans 最重要的属性就是 getter 和 setter 方法;用 Java p 查看该指令可以查看.class 文件的反编译的方法声明,还可以看到反汇编代码。
(2)案例代码如下:
package com.atguigu.chapter07 .homework
import scala. beans.
object Exercise02{
def main(args: Array[string]): unit = {
print ln( "ok")
}
class student {
//读写属性
@BeanProperty var name: string =_
@Bean Property var id: Long -_
}
(3)打开 Show in Explorer,现在用此指令跑一下,在输入框中搜索 cmd,在目录下面有刚刚编写的 Exercise02,首先需要进行编译,输入 Scala c Exercise02 Scala 之后,再输入 dir,此时生成了如下图的文件夹
(4)在此文件夹中,才有对应的 scala 文件,因为已经打包了,这样看不是很方便,为了方便先把代码 package com.atguigu.chapter07 .homework 注销,可以把包注销,反编译之后的 class student 文件在当前目录下就比较好找,再进行编译,可以看到 student. class 文件,如图:
(5)接下来用 Java p 指令来跑程序,可以看到Java在底层生成了一系列的方法,输入 Java p student .class,再点击回车键,便可看到当前的 Java 如图:
name()方法是默认生成的,跟注解无关;name-也是默认生成的,因为是 var 类型;set name、set id、get name和get id 是因为注解生成的;student 是默认的构造器,此指令把所有当前 class 反编译后的方法都展现出来了。
(6)除此之外,还可以看反汇编代码
在框中输入 Java p-c student .class,再回车,可以看到一些反汇编的代码,此作为了解。
二、包的引入
1、练习使用包的各种声明方式,并查看不同
这个不进行细讲,引入方式很多 import 指令
2、编写一段程序,将 Java 哈希映射中的所有元素拷贝到 Scala 哈希映射。用引入语句重命名这两个类。
(1)题目详解:
暂时是有难度的,因为关于集合的知识并未讲到。哈希映射就是 Hash Map, “用引入语句重命名这两个类”是说需要对类进行重命名,涉及到这个知识点。
(2)代码设置:
object Q6 extends App{
i
mport java. util.{HashMap => Java Hash Map}
//重命名,把 Java Hash Map 命名为 Java Hash Map,因为题目当中有要求
import collection. Mutable//
可变的意思
.{HashMap =>Scala HashMap,-}
val java Map = new Java Hash Map[Int ,String]// [Int ,String]
泛型,在Scala中泛型用“[
]”
表示,在Java中泛型用“<
>
”表示
java Map .put(1, "One");//
加入了四对key
-
val
java Map. put(2,"Two ");
java Map. put(3, "Three"');
java Map. put(4, "Four"');
val scala Map = new Scala Hash Map[Int ,String]//
创建了Scala的hash
map
for(key <- java Map.
ke
y Set(.to Array){
scala Map +=(key. as Instance Of[Int] -> java Map. get(key))
print ln(scala Map.
m
k String(""))
(3)对代码 java Map. key Set(.to Array详解
代码设置:
package com.atguigu.chapter07.homework
//说明
①//当我们继承了 App 后,就可以直接在这个类中执行代码,不需要在写 main 入口
object Exercise04 extends App {//
这里没有继续使用主函数,而是用了继承
i
mport java. util.{HashMap => Java Hash Map}//
重命名
i
mport collection. Mutable{HashMap =>Scala HashMap,-}
val java Map = new Java Hash Map[Int ,String]// [Int ,String]
泛型
java Map .put(1, "One");//
加入了四对key
-
val
java Map. put(2,"Two ");
java Map. put(3, "Three"');
java Map. put(4, "Four"');
val scala Map = new Scala Hash Map[Int ,String]//
创建了Scala的hash
map
//说明
②/
/
Java
map
.
key
Set(
)
.to Array
,这里是讲Java
map的key转成数组
for(key <- java Map.
ke
y Set(.to Array){
print
ln(“key
=
”
=
key
)
执行结果:
K
ey
=1
K
ey
=2
K
ey
=3
K
ey
=4
③// key. as Instance Of[Int]:将 key 强制转成 int 类型
④// java Map. get(key),得到 key 对应的 value
⑤//(key. as Instance Of[Int] -> java Map. get(key))是 key->value
⑥//+=:将 key->value 加入(拷贝)到 Scala map
⑦// print ln(scala Map. mk String("")):mk String 是说把 map 的内容取出之后,用空格间隔,形成字符串,返回的是 string 字符串
scala Map +=(key. as Instance Of[Int] -> java Map. get(key))
print ln(scala Map.
m
k String(""))
⑧对 APP 的深入理解
点开 APP 看看,是 trait APP,trait 是特制,在 Scala 里面兼顾 Java 的接口和抽象类的特点,换句话说,在Scala中trait 等价于 Java 的两个角色,这两个角色就是接口和抽象类,在 trait APP 中有一个方法直接把主函数放在里面了。
比如直接写代码进去,还是会执行的;代码如下:
object Exercise04 extends App {
print ln( "ok~~~")
执行结果:
ok~~~
因为"ok~~~"这句话被包含到了主函数当中,接下来看一下这段话的反编译代码,里面其实是生成了很多东西的,根本原因是在代码中加上了 APP,当继承了 APP,就会把 APP 里面的方法全都组进去,其中有一个方法便是主方法。
点击 Exercise04,进去之后可看到主函数,会用反射去调用 APP 当中的主函数,在主函数中,会加入所传的参数,最终进行调用和执行,大概逻辑是如此的。