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分
点评过的同学博客和代码
- 本周结对学习情况
- 20182326
- 结对照片
- 结对学习内容
- 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小时
-
改进情况:
这周逐渐摸清套路,缓慢进步。