20182303 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结
教材学习内容总结
4.8.1迭代器和for循环
1. 迭代器
- 使用集合中的方法
iterator()
获取迭代器的实现类对象,使用Iterator接口Iterator接口接受(多态) - 使用Iterator接口中的方法
hasNext()
判断还没有没有下一个元素 - 使用Iterator接口中的方法
next()
取出集合中的下一个元素
2. for循环的使用
用来遍历集合和数组
for (集合/数组的数据类型 变量名 : 集合名/数组名){
System.out.println(变量名);
}
编写类
1. 类与对象
- 类是对象的蓝图。
- 每个类包括为该类的对象定义的属性和操作。
- 对象的状态由与对象相关的属性定义。
- 对象的行为由与对象相关的操作定义。
- 类的数据和方法都称为类的成员。
2. UML类图
3. 静态类
4. 方法重载:两个或多个方法具有相同的名字。
5. 测试:测试的目的是发现错误,通过发现错误并修改它们来改进程序的质量。
教材学习中的问题和解决过程
- 问题1:迭代器和for循环对比
- 问题1解决方案:
效率上各有各的优势:
- ArrayList对随机访问比较快,而for循环中使用的
get()
方法,采用的即是随机访问的方法,因此在ArrayList里for循环快。 - LinkedList则是顺序访问比较快,Iterator中的
next()
方法采用的是顺序访问方法,因此在LinkedList里使用Iterator较快。 - 主要依据集合的数据结构不同判断。
- 问题2:
static
关键字会改变类中成员的访问权限吗? - 问题2解决方案:Java中的
static
关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private
、public
、protected
(包括包访问权限)这几个关键字。 - 问题3:能通过
this
访问静态成员变量吗? - 问题3解决方案:举个栗子
public class Main {
static int value = 33;
public static void main(String[] args) throws Exception{
new Main().printValue();
}
private void printValue(){
int value = 3;
System.out.println(this.value);
}
}
this
代表当前对象,那么通过new Main()
来调用printValue
的话,当前对象就是通过new Main()
生成的对象。而static
变量是被对象所享有的,因此在printValue
中的this.value
的值毫无疑问是33。在printValue
方法内部的value
是局部变量,根本不可能与this
关联,所以输出结果是33。
静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
- 问题4:如何理解“接口”,借口存在的必要意义?
- 问题4解答方案:接口是一组常量和抽象方法的集合(抽象方法是指没有实现的方法,即没有代码体,接口中没有实现的方法,参数列表的方法声明头后面仅跟着分号)。接口不能被实例化,类通过实现定义在接口中的每个抽象方法来实现这个接口,实现接口的类需在类声明头部使用保留字implements,再给出接口名,类中必须实现至少一个接口中的抽象方法,同时也可以定义其他方法。多个类可以实现同一个接口,一个类也可以实现多个接口。实现一个接口的类时,在接口中可以定义额外的方法。示例为一个简单的接口:
public interface Nameable
{
public static setName(String Name);
public String getName();
}
“接口是个规范”,这句没错。“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。比如说:我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。这两个对象是什么类型呢?Object a,b?肯定不行,a > b 这样的语法无法通过编译。int a,b?也不行?一开始就说了,不一定是数字。....所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。
四点关于JAVA中接口存在的意义(提高方法步骤灵活性):
1、重要性:abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力;
2、简单、规范性:接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白) ;
3、维护、拓展性;
4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。
代码调试中的问题和解决过程
- 问题1:IDEA遇到git上传问题
- 问题1解决方案:当前目录并非远程仓库的本地目录,所以惨遭拒绝。
- 问题2:MyDoc.java运行后出现乱码
- 问题2解决方案:设置右下角File Encoding为GBK即可解决。
- 问题3:int 32768转换为short是-32768?
- 问题3解决方案:32768=(1000 0000 0000 0000)2转换成short,则最高位的1变成符号位,于是是负数,所以是补码表示的,取反+1转换为十进制:0111 1111 1111 1111 + 1 = 1000 0000 0000 0000=(32768)10。加上负号:-32768
代码托管
上周考试错题总结
- Say you write a program that makes use of the Random class, but you fail to include an import statement for
java.util.Random
(orjava.util.*
). What will happen when you attempt to compile and run your program.
A .The program won't run, but it will compile with a warning about the missing class.
B .The program won't compile-you'll receive a syntax error about the missing class.
C .The program will compile, but you'll receive a warning about the missing class.
D .The program will encounter a runtime error when it attempts to access any member of the Random class
E .none of the above
正确答案: B 我的答案: A
解析:The missing class means that there will be undefined variables and/or methods. The compiler will detect these and will issue error messages. Your program won't be executable.(缺少的类意味着将有未定义的变量或方法。编译器将检测这些并发出错误消息。你的程序将无法执行。) - Consider the following enumeration
enum Speed { FAST, MEDIUM, SLOW };
A .The ordinal value of MEDIUM is 2
B .The ordinal value of SLOW is 1
C .The name of the Speed enumeration whose ordinal value is zero is FAST
D .The name of the Speed enumeration whose ordinal value is one is SLOW
E .None of the above
正确答案: C 我的答案: A
解析 :Enumerations have ordinal values beginning at zero, in left-to-right ascending order. So,Speed.FAST.ordinal( )
is zero,Speed.MEDIUM.ordinal( )
is one, andSpeed.SLOW.ordinal( )
is two.(枚举的序数值从零开始,按从左到右的升序排列。所以,speed.fast.ordinal()
为0,speed.medium.ordinal()
为1,speed.slow.ordinal()
为2。) - If you need to import not only the top-level of a package, but all its secondary levels as well, you should write:
import package.*.*
;
A .true
B .false
正确答案: B 我的答案: A
解析: import语句只能与单个*(通配符)一起使用。如果还需要导入包的所有二级,则必须显式写出它们:
import package.A.*;
import package.B.*;
- An example of passing message to a String where the message has a String parameter would occur in which of the following messages?
A .length
B .substring
C .equals
D .toUpperCase
E .none of the above, it is not possible to pass a String as a parameter in a message to a String
正确答案: C 我的答案: B
解析: length和touppercase消息没有参数,substring有两个int参数。对于equals,必须将字符串作为参数传递,以便将接收消息的字符串与作为参数传递的字符串进行比较。 - In a UML diagram for a class
A .classes are represented as rectangles
B .there may be a section containing the name of the class
C .there may be a section containing the attributes (data) of the class
D .there may be a section containing the methods of the class
E .all of the above
正确答案: E 我的答案: A
解析: Those four attributes correctly describe a UML representation of a class.
结对及互评
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 254/254 | 2/2 | 21/21 | 开始编写简单的程序 |
第二周 | 132/386 | 1/3 | 26/47 | 学会使用Scanner类 |
第三周 | 632/1018 | 2/5 | 21/68 | 学会使用部分常用类 |
第四周 | 663/1681 | 2/7 | 27/95 | junit测试和编写类 |
-
计划学习时间:20小时
-
实际学习时间:27小时