《程序设计与数据结构》第七周学习总结

学号 20172326 《程序设计与数据结构》第七周学习总结

教材学习内容总结

  • 继承,即一个类可以调用除构造方法以外的方法以及变量。
  • extend,在类头处声明,来继承父类
  • protect修饰符,使得子类可以调用在保证封装性的前提下,调用变量或方法
  • super引用,调用父类构造函数,以及父类的变量
  • fianl修饰符的限制,使得子类不能调用方法或变量
  • 设计程序时要注意层次结构,最大限度地减少重复部分

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

  • 问题:子类继承父类时,都继承了什么?
  • 问题解决方案: 看书后,我的第一理解是,继承了public和protectd类型的变量。以及方法。但接下来意识到,构造函数呢?如果继承父类的构造方法,那么加上子类自己的构造函数,一个类会产生两个构造函数,这显然不合理。并且super具有引用构造函数的功能,如果是自动继承父类,super自然不需要这个功能。同时书上的两个例题给出了一个例子

public class Thought
{
    public void message()
    {
        
        System.out.println(......);
        System.out.println();
    }
}

以及

public class Advice extends Thought
{
    public void message()
    {
        Sysetm.out.println(........);
        System.out.println(........);
        super.message();
    }
}

可以看到,Thought类是没有构造函数的,而继承它的Advice类同样没有。当然,类是可以没有构造函数的。这里更加加深了我的疑惑。它是有两个空的,还是怎样?
继续往下走,书上还有两个例子,下面分别是他们的构造函数

public FoodItem(int numFatGrams,int nmServing)
{
    fatGrams = numFatGrams;
    servings = numServing;
}

public class Pizza extends FoodItem
{
    public Pizza(int fatGrams)
    {
        super(fatGrams,8)
    }
}

来看看区别,两个中,一个构造函数为空也就是没有参数,一个有参数。也就是说,空的自动调用,反正调用了也是空的。但对于构造函数非空的情况,就需要用super,且在第一行声明。回到最开始的问题,子类继承了父类的构造函数吗?
--答案是没有,经过查找资料,可以得知,首先,构造函数是一种特殊的方法,并不能被子类直接继承。但我们又知道,子类能继承父类的所有方法,这势必与构造函数相关,所以,在没有用super引用构造函数时,子类会“调用”构造函数,从而获取其相关参数。这样,也就避免了一个类中有两个构造函数的问题。

  • 总结:
  1. 子类实例化对象时,会先调用父类的构造器
  2. 如果子类的构造器没有显示的调用父类的构造器 ,默认调用super();
  3. 子类要使用父类有参的构造器,使用super(参数)形式,且super必须是子类构造方法中的头一条语句。
  4. 如果父类没有不带参数的构造器,且子类的构造器中又没显示的调用父类其他构造器,则Java编译器将报告错误。

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

  • 问题:PP9.3继承问题
  • 问题解决方案:直接进行继承失败,该怎样呢?看书找找答案!书上还真有,仔细看,还是那个例题
    1333460-20180422235422542-2056556257.png
    1333460-20180422235451627-1198305569.png
super(fatGrams,8)

直接在参数列表里写好参数就好,那么,我有想到一个问题,super并未写出构造函数或是方法名,它是怎样对号入座的呢?查一查

有三种存在方式:
第一种
super.xxx;(xxx为变量名或对象名)
这种方法意义为,获取父类中的名字为xxx的变量或方法引用。
使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作
第二种
super.xxx();(xxx为方法名)
这种方法意义为,直接访问并调用父类中的方法。
第三种
super();
这种方法意义为,调用父类的初始化方法,其实就是调用父类中的public xxx()方法;

  • 这下就更加清楚了,同时张旭升学长也给予了详细的解答,向他表示感谢。
    1333460-20180422235625908-1567780261.png
    解决方法1333460-20180422235431412-1387368225.png

代码托管

1333460-20180422235354981-748881013.png

上周考试错题总结

  • 错题1

    The "off-by-one" error associated with arrays arises because--the first array index is 0 and programmers may start at index 1, or may use a loop that goes one index too far

  • 原因,理解情况:
  • “差一错误”是程序逻辑u错误,当引用超过数组(或类似结构)边界的第一个元素时将发生这种错误。这种错误还包括忘记处理边界元素和试图处理不存在的元素。数组的处理容易出现“差一错误”,,因为数组索引值的范围是从0至数组长度少一。
  • 错题

    Assume that BankAccount is a predefined class and that the declaration BankAccount[ ] firstEmpireBank; has already been performed. Then the following instruction reserves memory space for
    firstEmpireBank = new BankAccount[1000];--1000 reference variables, each of which point to a single BankAccount entry

  • 原因,理解情况:
  • Account数组实例化,但其内部0~999的数据并未实例化,所以只是预留了数组内部的内存空间,并未
  • 错题

    Given the following declarations, which of the following variables are arrays?
    int[ ] a, b;
    int c, d[ ];

  • 原因,理解情况:
  • 看错语句,导致错误。int[] a,b;就是分别定义两个int型的数组a和b。
  • intc,d[];是定义一个int型的数c和数组d
  • 错题

    If a and b are both int arrays, then a = b; will
    --A.create an alias

  • 原因,理解情况:
  • a与b将共用一组变量,成为别名。但是,如果数组长度不同会怎样呢?
  • 错题

    A Java main method uses the parameter (String[ ] variable) so that a user can run the program and supply "command-line" parameters. Since the parameter is a String array, however, the user does not have to supply any parameters.
    --true

  • 原因,理解情况:
  • 命令行参数可以传递参数。
  • 错题

    If the following statement is performed: CD[ ] mycollection = new CD[200]; where CD is a previously defined class, then mycollection[5] is a CD object.--true

  • 原因,理解情况:
  • CD为对象,mycollection为实例化后的对象,所以也是CD类
  • 错题

    It is possible to sort an array of int, float, double or String, but not an array of an Object class such as a CD class.--false

  • 原因,理解情况:
  • 可以排序,例如使用CompareTo方法
  • 错题

    So long as one is only accessing the elements of an ArrayList, its efficiency is about the same as that of an array. It's only when one begins to insert or remove elements towards the front portion of an ArrayList that its efficiency deteriorates.
    --true

  • 原因,理解情况:
  • arraylist中的数据在内存中是连续的,成块的,查找的时候直接顺序遍历内存就可以了。插入删除的时候,就要把修改的那个节点之后的所有数据都向后移动,或者向前移动。所以就慢了。
  • 单词总结
  • "command-line" parameters命令行参数

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

    纸上谈来终觉浅,绝知此事要敲代码!

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周110/1101/120/20
第二周315/4251/218/38
第三周475/9002/422/60
第四周600/15001/530/90
第五周1215/27151/620/110
第六周382/30971/720/130
第七周721/38181/815/145

参考资料

转载于:https://www.cnblogs.com/326477465-a/p/8911014.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值