20162330 2016-2017-2《程序设计与数据结构》第7周学习总结

本文总结了Java多态的概念、实现方式及其与接口的关系,包括多态引用、后绑定、接口方法、接口层次等内容,并探讨了软件包、访问权限、工厂方法模式等知识点。

2016-2017-2 学习总结目录: 1 2 3 4 5 6 7 8 9 10


20162330_刘伟康_ 第7周学习总结

教材学习内容总结

第九章 多态

  • 1.多态引用与后绑定(多种形式);(还未理解)

  • 2.实现多态(继承、接口);

  • 3.接口方法(抽象、公共);

  • 4.接口层次(继承适用于接口);

  • 5.Comparable接口、Iterator接口。(还未掌握)

蓝墨云班课

  • 1.Java当中的软件包;
    • 给一个类打包:package <包名>
    • 一个类的全名:“包名 +‘.’+ 类名”,例如 mars.Test
    • 包名的命名规范(小写)(颠倒域名中词的顺序,例如:域名mars.org,则包名为org.mars
    • 作用:为Java类提供了命名空间(将不同的类放在不同的空间)
    • 每个点都代表多了一个目录(文件夹)
  • 2.Java当中的访问权限(基本权限:四大类)
    • public(不同包)(全名)
    • private(同一个包)
    • default(默认,同一个包)
    • protected(类似default,还允许跨包继承)(仅限于继承)
    • public > protected > default > private
  • 3.软件包的导入(import *)

  • 4.接口
    • 接口就是标准
    • 基本语法(interface)(抽象)(public)(一对多)
    • 实现(implements)是一种特殊的继承。
  • 5.工厂方法模式(还未掌握)

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

  • 问题1:为什么有了public,还要用private、protected等定义从而导致一些访问权限出现问题?

  • 问题1解决方案:(蓝墨云班课)(搜索)
    在蓝墨云版课上老师说这是封装的原则:一个类(成员变量/成员函数)的权限应该尽可能的小。我又去网上搜索相关内容,解答大同小异,也都和我预想的差不多,是为了提高了程序的安全性:
    1062725-20170416155225415-382446684.png
    对于还没体会到程序的安全性的我来说,理解这种内容略有抽象,我又回顾了一下书中的内容,意思大致是:
  • 在面向对象设计的原则中,一个对象应该是自管理的,对象状态只能通过对象的方法完成。
    由此可见,以后的程序设计应更充分地考虑权限问题。当然,这也是一种降低耦合度的方法。

  • 问题2:Java当中的包名只要符合了命名规范,为什么就可以随便命名?(考虑到之前学的标准类库)

  • 问题2解决方案:(搜索)
    首先每一名Java程序员都可以编写属于自己的Java包,其次对于包有一定的命名规范:
    1062725-20170416162503056-1241976236.png

  • 标准类库中的类是按照包来组织的,综合来说,我觉得在Java标准类库中的包是面向大多数Java开发环境的,所以我们经常引入这些包,而自己随便定义的包是符合自己的个性的,适合个人使用。

  • 问题3:对于高内聚低耦合的进一步理解。

  • 问题3解决方案:(搜索)
    听娄老师讲了这个设计理念以及SOLID原则后,从字面上和一个例子中简单的理解了这个理念,搜索之后,加深了理解:
  • 高内聚:大致是在一个类或范围中,让所有的方法聚合在一起,最大程度上发挥作用。
  • 低耦合:各个范围区域之间,应该各自完善,减少之间的联系。
    1062725-20170416164646790-2007775717.png

  • 通过搜索,还让我对面向设计的原则又有了一层理解:
    1062725-20170416164700259-2021611776.png

  • 更全面专业的内容参考:软件设计之——“高内聚低耦合”

  • 问题4:对于Java中多态的后绑定不理解。

  • 问题4解决方案:(搜索)
    关于绑定相关的总结:
    对于java当中的方法而言,除了final,static,private和构造方法是前期绑定外,其他的方法全部为动态绑定。
    注意:在处理java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。访问到的始终是父类的属性,如果想要访问子类的成员变量,最简单的办法是将该成员变量封装成方法getter形式。

  • 找到一个实例:


public class Father {

  protected String name = "父亲属性";

  public String getName() {

    return name;

  }

  public void method() {

    System.out.println("父类方法,对象类型:" + this.getClass());

  }

}

  

public class Son extends Father {

  protected String name="儿子属性";

  
  public String getName() {

    return name;

  }

  
  public void method() {

    System.out.println("子类方法,对象类型:" + this.getClass());

  }
  
  public static void main(String[] args) {

    Father sample = new Son();//向上转型

//sample.method();

    System.out.println("调用的成员:"+sample.getName());

//System.out.println("调用的成员:"+sample.name);

  }

}
  • 结果:调用的是儿子的属性。
    注意:虽然父类中已经有了getName()方法,且子类可以继承这个方法,但是如果在子类中不覆盖这个方法(重新定义这个方法,尽管内容没变),那么上面程序返回的结果将还是"父亲属性",这可能与Java对成员变量都是采用静态绑定有关。所以必须复写那个getter方法才能访问到子类自己的属性,不然无效。
    详细可参考:Java多态性中的静态绑定和动态绑定总结
  • 感觉还不是很理解,可能是前面基础有些漏洞,对于封装方式getter和setter还需要进一步认知。

  • 问题5:蓝墨云班课上的问题,不理解下图中的null在这里的意义。
    1062725-20170416173707071-816114422.png

  • 问题5解决方案:(搜索)
    原来是给变量初始化使程序得以正常运行。(前面的东西忘光了!)
    1062725-20170416173720134-1141189007.png

  • 问题6:对于Comparable接口、Iterator接口不了解。(有待解决)

  • 问题6解决方案:(搜索)
    此问题还有待于实践和思考。找到一篇质量较高的博客:Comparable接口的实现和使用

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

  • 问题1:在编译代码时显示缺少方法主题,或声明对象。
    1062725-20170416173816446-174897408.png

  • 问题1解决方案:(搜索)(检查)
    我搜索到的出错原因如下:
    1062725-20170416173841196-946501696.png
    1062725-20170416173848587-140482582.png
    仔细排查后,我发现自己在方法体前面多加了一个分号,从而导致无法识别。(如图)
    1062725-20170416173827024-519928321.png

  • 问题2:在数组实验中数组越界的问题。
  • 问题2解决方案:(思考后尝试)
  • 原来我的数组是这样编辑的:(要求是第二行删除5,并输出12346780)
    1062725-20170416180003540-1882181220.png
    编译失败:
    1062725-20170416180032727-88352968.png
    在编译失败后我发现是在最后,即当i = 7的时候执行了i++后将第九位的值赋给第八位,由于原数组没有第九位,所以显示数组越界的错误。
    将i的上限改为6即可解决问题。
    1062725-20170416180042821-898228220.png

  • 问题3:我新建了一个虚拟机来运行eclipse(之前的不能用),在安装git时出现错误。
    1062725-20170416181008352-1745133587.png

  • 问题3解决方案:(搜索)
    1062725-20170416181015852-1976356053.png
    找到解决方案之后,我又再想错误类型,应该是由于我没能一次性下载git所致,在使用apt-get install安装时,如果未完成则会出现终端进程自动关闭的情况,第二次安装就可能出现错误。(详见下图)
    1062725-20170416181024352-122121356.png

  • 问题4:在面向程序设计实验(二)中,不理解buffer.indexOf的作用。

  • 问题4解决方案:(搜索)(猜测)
    看名字大致意思是什么的索引,在API上查找了没有,之后就开始搜索。
    搜索到的大致内容是:字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个字符依此类推)如果说没有找到则返回 -1 。(注意索引从1开始)
    这次我尝试了一下:
    先由于没有找到该字符串,所以结果预计为-1(成功):
    1062725-20170416184109040-28393917.png
  • 之后尝试了Buffer类型,B刚好是第六个字符,所以输出为6:
    1062725-20170416184123774-1505930205.png

代码托管

  • week7
    1062725-20170416195524462-757277805.png
    1062725-20170416195532540-1324975454.png
    1062725-20170416195544806-392552332.png
    (statistics.sh脚本的运行结果截图)

上周考试错题总结(绿色选项为正确答案)

第五周测试:

  • 错题1:以下哪类方法没有任何返回值类型(甚至没有void返回值类型)?
    A .methods declared as static(声明为static的方法)
    B .methods declared as public(声明为public的方法)
    C .methods declared as private(声明为private的方法)
    D .constructors(构造函数)
    E .all of the above have return types(以上均有选项均有返回值类型)

  • 解析:构造函数是唯一没有任何返回类型的方法。他们甚至没有一个void返回类型。所有其他的方法必须指定返回类型或被宣布为无效。

  • 错题2:_____变量由类的所有实例共享.
    A .static
    B .final
    C .public
    D .private
    E .none of the above(以上都不是)

  • 解析:一个静态变量在一个类的所有实例共享。最后一个变量是一个常数,一个公共变量是一个从外部对象和一个访问私有变量是无法访问外部的对象。

  • 错题3:___引用总是指向当前正运行的对象.
    A .null
    B .static
    C .final
    D .actual
    E .this
  • 解析:这个引用总是指当前执行的对象。一个空引用,不指向任何对象的引用。其他三个选择并不特别引用在Java中。

  • 错题4:如果一个服务非常复杂,以至于不能用一个方法来实现,一般通过将方法分解成几个____支撑方法.
    A .static
    B .aggregate(聚合)
    C .private(私有)
    D .public
    E .final
  • 解析:私人支持方法非常有用当服务被定义在一个单一的方法太过复杂。因此选d是正确的。

  • 错题5:当把对象传递给方法时,实参和形参互为别名.
    A .true
    B .false
  • 解析:实际参数的数据发送到该方法。正式的方法定义中使用的参数。当对象被发送到一个方法,这两个值是引用,成为彼此的别名。

  • 错题6:如果有以下程序片段:
  class Some{
void doService(){
 System.out.println("some service");
 }
   }
  class Other extends Some{
@Override
void doService(){
 System.out.println("others srrvice");
 }
   }
public class Main{
 public static void main(String[] args){
  Other other = new Other();
  other.doService();
 }
   }

以下描述正确的是
A .编译失败
B .显示some service
C .显示other service
D .先显示some service后显示other service

  • 运行结果:(按照源代码应该是other srrvice)
    1062725-20170416192554102-814053400.png

  • 错题7:如果有以下程序片段:
  class Some{
String ToString(){
 return "Some instance";
 }
  }
  public class Main{
  public static void main(String[] args){
   Some some = new Some();
   System.out.println(some);
  }
  }

以下描述正确的是
A .显示Some Instance
B .显示Some@ XXXX,XXXX为十六进制的数字
C .发生ClassCastException
D .编译失败

  • 运行结果:
    1062725-20170416192815587-1098787621.png

第六周测试:

  • 错题1:为了能在派生类中引用超类中封装的数据成员和方法,可以使用修饰符____声明.
    A .private
    B .public
    C .protected
    D .final
    E .static
  • 解析:使用受保护的数据成员和声明的方法修饰符可以被子类访问在一个继承层次结构,但仍封装从层次结构之外的类和方法。
  • 错题2:在父类中声明为private的方法和变量不能被子类访问.
    A .true
    B .false
  • 解析:为了让子类可以访问父类的私有数据和方法,他们应该宣布使用受保护的修饰词,仍然执行封装,但允许一个继承层次结构的灵活性。
  • 错题3:如果有以下的程序代码:
Int x=100;
Int y=100;
Integer wx=x;
Integer wy=y;
System.out.println(x==y);
System.out.println(wx==wy);

在JDK5以上的环境编译与执行,则显示的结果是
A .true、true
B .true、false
C .false、true
D .编译失败

  • 解析:Integer类可以将int类型的值包装到一个对象中。而自动“拆箱”和“装箱”是依靠JDK5的编译器在编译期的“预处理工作”。
  • 错题4:如果有以下的程序代码:
String [][] strs={
{“Java”,“Java”,“Java”} ;
{“Java”,“Java”,“Java”,“Java”};
};
For(______ row:strs){
For(____ str:row){
.........
}
}

空白处应该分别填上
A .String、String
B .String、String[]
C .String[]、String
D .String[]、String[]

  • 解析:此题定义了一个二维数组,要遍历原数组中每一个数组对象,还要遍历每一个数组对象中的数,所以选C。

结对及互评

  • 我的结对对象张旭升仍然保持优势,他善于实践,习惯将理论与实践紧密结合,并且概念清晰,只是个别几处细节不够注意,导致有的时候出现一些编译错误。对于我这个理论与实践稍有脱层的人来说,张旭升给予我很多帮助,希望我也能能保持这周的状态,继续结对学习。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20162329
    • 结对照片:主要是讨论,实践截图就相当于照片吧。1062725-20170416190354212-106742734.png

    • 结对学习内容
      • 实验讨论
      • 书中概念
  • 上周博客互评情况

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

  • 本周内容相对较少,但是加上实验以及学习内容比较抽象,仍然需要对此多练习并加深理解,尤其对于课上讲到的类设计的SOLID原则,和Java中关于高内聚、低耦合的理念,需要长期有效练习才能理解。
  • 本周我的时间安排还算合理,周一到周三把之前的内容稍微回顾了一遍,又把之前的PP项目完成了(部分PP项目是参考同学的);周四又把之前不太理解的视频看了一遍,周五准备实验,周六做实验并看完这周的视频,今天上午又大致看了课本内容。可以说是有自己的节奏但是又不太脱离群体进度。(进度稍有落后)
  • 在练习中,我发现还是自己的实践能力不够强,眼看代码量即将达到本学期的目标,可是头脑中的设计理念和逻辑仍然比较混乱,每次看视频也是感觉思路有点快。娄老师说当代码量在5000行左右时,就应该具有一种自己动手编程的意识,而我现在还存在一些编译错误,说明我还要针对语法进行有效练习,其次,我应该及时梳理所学内容,能简洁的就尽量简洁,要形成一种清晰的设计理念。
  • 总之,本周状态有所回升,下周将继续对时间进行细化管理。

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周95/951/412/12学会了编写简单的脚本和课本上的java程序
第二周512/6071/514/26学会了Scanner类编写简单的java程序,了解了数据转换相关知识
第三周484/10911/614/40学会了创建简单的String,Random,Math等类的对象,安装并使用IDEA工具,并且了解了一些java位运算符
第四周1176/22672/824/64学会了条件及循环语句的基本表达,大致了解数组元素及对象数组的概念
第五周838/31051/914/78加深了对面向对象、方法结构和类定义的理解
第六周427/35321/1012/90主要了解super调用函数的方法,继承及其目的
第七周1086/46182/1218/108了解接口,理解多态,大致学习了工厂模式,UML建模,TDD

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

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

  • 计划学习时间:20小时

  • 实际学习时间:18小时

  • 有效学习时间:6小时

  • 改进情况:
    本周先大致理解了视频中的内容,再进行课本学习,效率稍有提升。仍有一部分内容未理解,还有一部分内容忘记或者之前没有看完,需要再投入一部分时间回顾。

(有空多看看现代软件工程 课件 软件工程师能力自我评价表)

参考资料

转载于:https://www.cnblogs.com/super925/p/6718913.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值