20182301 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结

教材学习内容总结

  • 面向对象程序设计的核心是类的定义,它代表定义了状态和行为的对象
    • toString方法在将对象传递给print和println方法,以及将一个对象与一个字符串连接时,会自动调用对象的toString方法
public String toString()
{
    String result = Integer.toString(faceValue);
    return result;
}
  • 变量的作用域依赖变量声明的位置,作用域决定在哪里可以使用变量
  • 封装
    • 不允许对象的代码直接访问变量,只能调用
    • 可见性修饰符控制类中成员的访问权限。public,private和protected
    • 访问方法:getX;设置方法:setX;客户可以通过它管理数据
  • return
    • 方法头部指定的返回值类型可以是:基本类型、类名、保留字void
    • 方法的返回类型应该与方法头中规定的返回值类型一样
    • 方法应该只有一条return语句作为方法体的最后一行
  • 参数
    • 当调用方法时,将实参复制给形参
    • 方法中,形参和实参互为别名
  • 构造方法
    • 构造方法不能有任何的返回值,即使是void也不行
    • 用来初始化新创建的对象
  • 静态变量
    • eg:private static int count = 0;
    • 静态变量由类中的所有实例所共享
    • 方法内声明的局部变量不能是静态的
  • 静态方法
    • eg:Math类的所用方法都是静态方法
    • public static void main(String[] args)运用static,所以,main可以由解释程序运行,而不需要实例化。
    • 静态方法不会对具体的对象进行操作
    • 静态方法只能访问静态变量或局部变量
  • 聚合
    • 聚合对象由其他对象组成,形成has-a关系
    • 聚合是一类特殊的依赖关系
  • this引用
    • eg:if(this.positise==pieces.positise) result = fault;
    • this引用用来指明某个位置
    • 常用来区分构造方法中参数与对应的同名实例变量(见书p128)
  • 方法重载:让多个方法使用相同的方法名但有不同的参数列表
    • 当调用方法时,控制流将转用定义方法的代码
    • 重载方法的各个版本由参数个数、类型及次序来区分
    • eg:参数的类型、个数等不同
  • 测试
    • 审核:用来评价设计或代码的一项技术
    • 缺陷测试:可以发现错误,进行黑盒测试
    • 单元测试:每个测试创建一个测试用例
    • 集成测试:作为一个整体进行测试
    • 系统测试:观察需求
    • 测试驱动开发:先写测试用例,再进行源代码

教材学习中的问题和解决过程

  • 问题1:抽象类与接口有什么区别
  • 问题1解决方案:抽象方法不用具体书写。要不就抽象,要不就实例化
    • 抽象类中可以存在非抽象的方法 ; 接口中的方法被默认的变成抽象方法,只要是定义了接口,接口中的方法就全部变成了抽象类即使你不写abstract 它也是抽象的方法
    • 接口是抽象类的一种, 也可以说接口是抽象类的延伸
    • 抽象类可以有私有的成员变量和成员方法 ; 接口中的方法全都被默认的修饰为: public abstract 类型的方法
    • 一个类只能继承一个抽象类 一个类可以实现多个接口 ,接口可以实现多继承 举例:interface display extends aa ,bb,cc ...等等 ,然后让类去实现 display的接口 就可以实现 display aa bb cc接口
    • 抽象类中的非抽象的方法可以选择继承 ; 接口中的方法必须全部被重写 ,并且全部是公有的public 方法.
  • 问题2:新建变量有几种方法
  • 问题2解决方案:
    • 关键字 new。工厂模式是对这种方式的包装;
    • 类实现克隆接口,克隆一个实例。原型模式是一个应用实例;
    • 用该类的加载器,newinstance。java的反射,反射使用实例:Spring的依赖注入、切面编程中动态代理
    • sun.misc.Unsafe类,allocateInstance方法创建一个实例。(Java官方也不建议直接使用的Unsafe类,据说Oracle正在计划从Java9中去掉Unsafe类)
    • 实现序列化接口的类,通过IO流反序列化读取一个类,获得实例。
    • 如果是静态变量就直接用
  • 问题3:局部数据和实例数据有什么区别?
  • 问题3解决方案:(如图:)

  • 问题4:什么叫做交互?
  • 问题4解决方案:
    • 构造函数传递
    • 通过getX和setX方法
    • 接口

代码调试中的问题和解决过程

  • 问题1:Coin中(如下),为什么要有这个,既然有为什么不把isHead写进去?

  • 问题1解决方案:flip方法,将硬币设为初始的随机状态;
  • 问题2:Account中的free,为什么要使用?

  • 问题2解决方案:我初步认为这应该是信用额度,可提前支出

代码托管

上周考试错题总结

  • In order to preserve encapsulation(封装) of an object, we would do all of the following except for which one?
    • A .Make the instance data private
    • B .Define the methods in the class to access and manipulate the instance data(定义类中的方法来访问和操作实例数据)
    • C .Make the methods of the class public
    • D .Make the class final
    • E .All of the above preserve encapsulation
    • 正确:D
    • 原因:封装意味着类包含操作数据所需的数据和方法。为了正确地保留封装,实例数据不应该直接从类外部访问,因此实例数据被设为私有,并定义方法来访问和操作实例数据。此外,访问和操作实例数据的方法被公开,以便其他类可以使用该对象。保留字“最终”用于控制继承,与封装无关。
  • Consider a sequence of method invocations as follows: main calls m1, m1 calls m2, m2 calls m3 and then m2 calls m4, m3 calls m5. If m4 has just terminated, what method will resume execution?(考虑以下方法调用序列:主调用m1, m1调用m2, m2调用m3,然后m2调用m4, m3调用m5。如果m4刚刚终止,什么方法将恢复执行)
    • m2
  • A variable whose scope is restricted to the method where it was declared is known as a(n)(一个变量的作用域被限制在它声明的方法中,称为A (n))
    • A .parameter(参数,系数)
    • B .global variable(全局变量)
    • C .local variable(局部变量)
    • D .public instance data(公共实例数据)
    • E .private instance data(私人实例数据)
    • 正确:C
  • A class' constructor usually defines
    • A .how an object is initialized
    • B .how an object is interfaced
    • C .the number of instance data in the class
    • D .the number of methods in the class
    • E .if the instance data are accessible outside of the object directly
    • 正确:A
    • 原因:构造函数应该用于“构造”对象,即设置实例数据的初始值。这不是必需的,但通常是这样做的。对象的接口由实例数据和方法上使用的可见性修饰符决定。
  • The following method header definition will result in a syntax error: public void aMethod( );
    • 正确:true
    • 原因:语法错误的原因是它以“;”符号结束。相反,它需要在{}后面加上括号内的0或更多的指令。抽象方法将以“;”结束,但是这个头没有定义抽象方法。
  • While multiple objects of the same class can exist, in a given program there can be only one version of each class
    • 正确:true
    • 原因:类是一个抽象,也就是说,它作为一个定义而存在,而不是作为一个物理实例而存在。使用new实例化对象时创建物理实例。因此,可以有许多String类型的对象,但只有一个String类。
  • An object should be encapsulated in order to guard its data and methods from inappropriate access.
    • 正确:true
    • 原因:封装是这样一个概念:应该保护对象不受意外(或有目的)的误用。
  • Accessors and mutators provide mechanisms for controlled access to a well-encapsulated class.
    • 正确 :true
    • 原因:访问器提供对变量的读访问,否则这些变量是不可访问的。mutator提供对以其他方式不可访问的变量的写访问
  • Java does not support multiple inheritance, but some of the abilities of multiple inheritance are available by
    • 正确:
    • A .importing classes
    • B .implementing interfaces
    • C .overriding parent class methods
    • D .creating aliases
    • E .using public rather than protected or private modifiers
    • 正确:B
    • 原因:因为一个类可以实现任意数量的接口,所以这个类本质上使用接口类,就好像这些接口是在这个类中定义的一样。这个类继承了接口的方法和常量。此外,该类可以扩展另一个类,从而直接或间接地继承多个类。这与多重继承并不完全相同,但它与Java的概念非常接近
  • In order to determine the type that a polymorphic variable refers to, the decision is made
    • A .by the programmer at the time the program is written
    • B .by the compiler at compile time
    • C .by the operating system when the program is loaded into memory
    • D .by the Java run-time environment at run time
    • E .by the user at run time
    • 正确:D
    • 原因:多态变量可以具有许多不同的类型,但是在程序执行之前,它不知道自己具有哪种类型。在引用变量时,必须做出决策。这个决定是由运行时环境做出的
  • Which of these is correct?
    • A .a base class is a parent class or super class
    • B .a base class is a child class or derived class
    • C .a child class is a super class of its parent
    • D .a parent class is a subclass of its child
    • E .none of the above
    • 正确:A
    • 原因:术语、基类、父类、超类是彼此的同义词。它们都暗示类将被用作继承的基础,并且后续的类将扩展(继承)基类
  • Why shouldn't an abstract method be declared final?
    • A .There's nothing wrong with doing so
    • B .Abstract methods cannot be overridden and they must be if a concrete class ever is to be instantiated
    • C .So long as the Abstract method never actually is used in by any other method, there's no problem with doing this
    • D .So long as the Abstract method is declared in a Class (not an Interface), there's nothing wrong with doing this
    • E .None of the above
    • 正确:B
    • 原因:为了使抽象方法变得具体,必须覆盖它。将一个方法声明为final使得不可能覆盖它。这是矛盾的,是禁止的
  • Interface classes cannot be extended but classes that implement interfaces can be extended.
    • 正确:True
    • 原因:任何类都可以扩展,不管它是接口、实现接口还是两者都不可以。唯一的例外是类被“final”显式修改,在这种情况下不能扩展。
  • You may use the super reserved word to access a parent class'private members.
    • false
    • 原因:Super将允许访问父类的所有非私有成员,但不允许访问私有成员。
  • Although classes can be inherited from one-another, even Abstract classes, interfaces cannot be inherited.
    • false
    • 接口具有普通类所具有的所有继承属性。因此,您可以创建接口继承层次结构,就像您可以创建类继承层次结构一样。但是,您不能实例化必须实现的接口。

结对及互评

  • 博客中值得学习的或问题:

    • 类和包究竟有什么关系?public类具体是修饰什么的,为什么当其存在时文件名与其所修饰的类要相同?(2330)
    • 枚举类型好像挺鸡肋的,到底有啥用?(2311)
  • 代码中值得学习的或问题:

    • Math里面的随机数方法是random不是Random,注意区分大小写。
    • 在输入字符时,使用nextChar方法(2303)
  • 基于评分标准,我给本博客打分:14分。得分情况如下:

    • 正确使用Markdown语法 1分
    • 模板中的要素齐全 1分
    • 教材学习中的问题和解决过程 4分
    • 代码调试中的问题和解决过程 2分
    • 感想,体会不假大空 1分
    • 排版精美的 1分
    • 进度条中记录学习时间与改进情况 1分
    • 点评认真,能指出博客和代码中的问题 1分
    • 错题学习深入 1分
    • 结对学习情况真实可信 1分

点评过的同学博客和代码

  • 本周结对学习情况

- 结对学习内容
    - idea插件运用
    - 码云链接上传

其他(感悟、思考等,可选)

现在的学习难度逐渐加大,我认为我需要去自己学习,自己感悟,自己理解,不断进步。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 69/69 2/2 30/30
第二、三周 529/598 3/5 25/55
第四周 443/1041 2/7 25/80

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:25小时

  • 实际学习时间:25小时

  • 改进情况:
    这周逐渐摸清套路,缓慢进步。

参考资料