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解决方案
    效率上各有各的优势:
  1. ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是随机访问的方法,因此在ArrayList里for循环快。
  2. LinkedList则是顺序访问比较快,Iterator中的next()方法采用的是顺序访问方法,因此在LinkedList里使用Iterator较快。
  3. 主要依据集合的数据结构不同判断。
  • 问题2static关键字会改变类中成员的访问权限吗?
  • 问题2解决方案:Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有privatepublicprotected(包括包访问权限)这几个关键字。
  • 问题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

代码托管

上周考试错题总结

  1. Say you write a program that makes use of the Random class, but you fail to include an import statement for java.util.Random (or java.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.(缺少的类意味着将有未定义的变量或方法。编译器将检测这些并发出错误消息。你的程序将无法执行。)
  2. 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, and Speed.SLOW.ordinal( ) is two.(枚举的序数值从零开始,按从左到右的升序排列。所以,speed.fast.ordinal()为0,speed.medium.ordinal()为1,speed.slow.ordinal()为2。)
  3. 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.*;
  4. 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,必须将字符串作为参数传递,以便将接收消息的字符串与作为参数传递的字符串进行比较。
  5. 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小时

参考资料

深入理解迭代器
static理解

posted @ 2019-09-30 21:12  zdyyy  阅读(242)  评论(1编辑  收藏  举报