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

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

教材学习内容总结

  • 关键概念

    1. 多态引用在不同的时候可以指向不同类型的对象
    2. 多态引用在运行时才将方法调用与它的定义绑定在一起
    3. 引用变量可以指向声明继承于它的任意类的任何对象
    4. 对象的类型,而不是引用的类型,决定调用的是方法的哪个版本
    5. 接口是一组抽象方法,所以不能被实例化
    6. 继承可适用于接口,所以一个接口可派生于另一个接口
    7. 接口引用可以指向实现这个接口的任意类的任何对象
    8. 方法的参数可以是多态的,这样使方法具备了对其参数进行控制的灵活性
    9. 在侦听器和所侦听组件之间建立关系是通过多态完成的
  • 重点总结

    1. 当一个类给出了接口中定义的每个抽象方法的实现是,就称类实现了接口
    2. 如果接口中的某个方法没在类中实现,则编译错误
    3. 接口只保证类实现了某些方法,但它不限制类可以有其他的行为
    4. 多个类可以实现同一个接口,并在类中提供它们各自对方法的定义
    5. 接口中还可以包含常量,这些常量用final修饰符来定义
    6. 子接口继承父接口中的所有抽象方法和常量。实现子接口的任何一个类必须实现所有的方法
    7. 接口中所有成员都是公有的

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

  • 问题1:如何理解书中

对象的类型,而不是引用的类型,决定调用的是方法的那个版本

  • 解决思路:当一个父类对象的引用变量,它引用子类对象时,决定调用谁的成员方法的条件是:被引用对象的类型而不是引用变量的类型。但是这个被调用的方法必须是在父类中定义过,也就是子类覆盖过的方法。

  • 问题2:关于动态绑定
    1.关于绑定

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.

2.静态(前期)和动态(后期)绑定

静态:在程序执行前方法已经被绑定,java当中的方法只有final,static,private和构造方法是前期绑定。(个人认为将方法声明为final既是为了方法被覆盖也是为了关闭动态绑定,static,private由于不能被继承所以在编译时就可以确定值)
动态:在运行时根据具体对象的类型进行绑定。

3.动态绑定的细节(来自网络)
  1. 编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法,并且x已经被声明为C类的对象,那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法
  2. 接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配,那么就调用这个方法,这个过程叫做“重载解析”
  3. 当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f(String)那么该方法被调用,否则就在D的超类中搜寻方法f(String),依次类推
4.我的例子
    public class Testme {
    public static void main(String[] args){
        Father people = new Son();
        people.high();
    }}
    class Father{
    public void high(){
        System.out.println("170");}}
    class Son extends Father{
        public void high(){
            System.out.println("120");}}

声明了Father类型变量people但它指向是一个Son的对象,其调用Son的方法,因为在运行时发生了动态绑定,在绑定过程中需要确定调用哪个版本的high方法实现。

  • 问题3:关于接口的继承问题
  • 描述:书中介绍继承的概念出适用于类外,还适用于接口,那么接口继承是否和类继承一般不支持多继承。

(来自网络)java接口可以多继承。Interface Extends Interface0, Interface1, interface3
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。

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

  • 问题1:static关键字
  • 描述:在做实验时有如下代码
    public class Mydoc {
    Document d;
    public static void main(String[] args) {
        d = new Document(new IntFactory());
        d.DisplayData();
        d = new Document(new FloatFactory());
        d.DisplayData();
    }
}

此时程序提示Non-static filed 'd' cannot be referenced from a static context

  • 解决过程:因为静态方法不会对具体的对象进行操作,所以它们不能引用只在类的实例中才存在的实例变量。所有的静态方法,包括main方法,都只能访问静态变量或局部变量。
    所以static Document d

代码托管

  • 代码截图

上周考试错题总结

  • 1.如果有以下的程序代码:
    Int x=100;
    Int y=100;
    Integer wx=x;
    Integer wy=y;
    System.out.println(x==y);
    System.out.println(wx==wy);
在JDK5以上的环境编译与执行,则显示的结果是[true,true]
  • 1.分析:不了解Integer类

Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。
此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。

  • 2.如果有以下的程序代码:
     int[] arr1 = {1, 2, 3};
     int[] arr2 = new int[arr1.length];
     arr2 = arr1;
     for(int value : arr2) {
     System.out.printf("%d", value);
     }
以下描述何者正确? [执行时显示:123]
  • 分析;fot-each语句,等价于下列语句
    int value
    while(arr2.hasNext()){
    myBook = bookList.next();
    System.out.println(value);}

结对及互评

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

  • 转瞬间书本已经过半了,知识还很散,需要一次总结。
  • 这周的实验介绍了Junit进行单元测试,但对于编写好的测试代码还有很大很大的不足。
  • 课外的知识汲取很有必要,没事可以多看看别人的博客,交流经验
  • 多看课外书,这周的读书让我感受很多,收获很多

第二次试验Java面向对象程序设计

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第五周 200/1500 2/6 20/20
第六周 200/1700 1/7 18/38
第七周 500/2100 2/9 20/58
第八周 000/0000 0/0 00/00

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

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

  • 计划学习时间:XX小时

  • 实际学习时间:XX小时

  • 改进情况:

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

参考资料

posted @ 2017-04-16 18:32  Wb同学在此  阅读(427)  评论(10编辑  收藏  举报