第4周学习总结

20165226 2017-2018-3 《Java程序设计》第4周学习总结

教材学习内容总结

第五章 子类与父类

  • 类的继承知识点
    (1)java不支持多重继承,也就是说子类至多只能有一个父类
    (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
    (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承
    (4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。

  • jvm的执行过程
    (1)子类B 的构造方法被调用,实例化一个B对象,B对象的成员被初始化
    (2)jvm隐含的调用父类的构造方法,实例化一个A对象,A对象的成员被初始化。
    (3)由于A对象的printI()未被屏蔽,所以调用的A对象的printI()函数。
    那么,在这里A的成员函数当然是访问自己的成员变量了。

  • super关键字
    super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中,目的是访问直接父类中被屏蔽的成员。

第六章 接口与实现

  • 使用关键字interface来定义一个接口
interface Printable {
   final int MAX=100;
   void add();
   float sum(float x,float y);
}
  • 接口表示方法
    • 圆形表示法
    • 构造型表示法

  • 一个类中需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个需要用逗号隔开接口名。
  • 实现关系的UML图

  • abstract类vs接口

    • 都可以有abstract方法。
    • 接口只能有常量,不能有变量;abstract类有既有常量又有变量。
    • abstract类也可以有非abstract类方法,接口不可以。
  • 程序设计后之后,首先应当对接口的修改“关闭”。

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

  • 问题1:看到p115时,不禁想到java中如果创建一个子类的对象,那么父类的对象是否被创建了?

  • 问题1解决方案:通过查找资料,发现:不会,按理来说,子类继承父类的话,构造方法父类先执行,那么这个执行应该只是代码上的,对象的话应该是没有创建的。多态其中一条很明显的道理,父类引用指向子类对象。那么这个引用的话,应该只是代码上的引用。

  • 问题2:书上122页上提到super这个关键字,想到上一章提到的this,产生了疑问:superthis有什么不同?

  • 问题2解决方案:其实super.不是“东西”,说道super.自然会想到this.,有人把他们归为同类,其实他们大大不同
    - this:是一个真真实实对象,代表的就是当前对象,可以用 return this; 去返回一个对象。
    - super:不能一个对象,不是指向父类对象的意思,super只是修饰了他后边的内容,告诉JVM,后面这部分内容不是当前对象所属类的内容而已,若用return super,JVM是不允许的,是一种错误的语法。

public static void main(String args[]) {
        Chilren b = new chilren();
        Father c = b
        System.out.println(b.age);
        System.out.println(c.age);
}
 输出
18
40
```  
 
看到上面这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有自己的实例 变量,同时也存在父类所定义的全部实例变量。

       所以可以得出结论:`在实例化一个子类的同时,系统会给子类所有实例变量分配内存,也会给他的父类的实例变量分配内存,及时父子类中存在重名的实例变量,也会两个都分配内存的,这个时候子类只是隐藏了父类的这个变量,但还是会给它分配内存,然后可以用super来访问属于父类的变量。`

- 问题3:有些不明白,实际上创建的是子类的实例,为什么调用的是子类的方法,父类的成员变量?
- 问题3解决方案:通过查找资料,得到以下解释

这是java多态性的表现,要深入理解的话得从内存方面去思考,创建的是子类对象,但是指针类型是父类的,它能指向的内存块是父类应能对应的内容。当你把A类得Area()方法删除时,a指向的内存块里没有Area方法,或者说它指向的这个对象虽然有这个方法,但是这个指针却是没法去访问该方法的, 所以出现无法访问的情况。

- 问题4:教材121中`如果子类如下定义computer方法,是否属于重写继承的computer方法的`通过编译运行,结果是

17.0
20

为什么不属于重写computer方法,编译无错误呢?
- 问题4解决方案:子类在重写可以继承的方法时,完全可以按照自己的意图编写新的方法体,以便体现重写方法的独特的行为。

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


- 问题1:编译之后,运行时,系统出现`错误: 找不到或无法加载主类 Example5_2`

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320154945293-45101630.png)


- 问题1解决方案:重新在**src**目录中编译了一次,再运行
- 问题2:运行Example5_5.java文件时出现了'17.0   20'的结果

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320165826238-1007782844.png)


- 问题2解决方案:将Example5_5.java的子类中程序

float computer (float x,float y,double z) {
return x-y;
}

改成

float computer (float x,float y) {
return x*y;
}

- 问题3:运行书中122例七结果却如下图

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320175117334-714611902.png)

- 问题3解决方案:vi了以下代码,发现其中次序有所颠倒,于是将其改成

float resultOne = aver.f();
float resultTwo = aver.g();

再进行编译运行,结果正确。

**注:当super调用被隐藏的方法时,该方法中出现的成员变量时被子类隐藏的成员变量或继承的成员变量**

- 问题4:运行书上例13时出现了以下状况

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180320190631877-2021772298.png)
- 问题4解决方案:通过编译`Application.java`这个文件,再`java Application`,结果成功运行

- 问题5:运行第五章课后习题时出现如下图所示问题
![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180321153728030-245736702.png)

- 问题5解决方案:认真校对代码后发现将`println`拼写成了`pritnln`,更改过后顺利运行
## [代码托管](https://gitee.com/BESTI-IS-JAVA-2018/20165226lxs)

![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180322194853357-564613720.png)


## 上周考试错题总结
- 错题1:`表达式0xaa|0x55的值`
      - 原因:最后的结果仍应换成十六进制
      - 总结:在运算过程中,应注意进制
- 错题2:`表达式-2>>>1的值`
     - 原因:没区分`>>>`和`>>`
     - 总结:`>>>`是无符号右移,即无论正负数,右移之后符号位均补0,-2的二进制无符号右移一位之后为0111 1111 1111 1111 1111 1111 1111 1111,即2^31-1。
- 错题3:`下列与3*4的值相等的是`
     - 原因:关于运算符的运算先后没弄清楚
     - 总结:3*4即3左移两位。`^`在Java中表示亦或。
- 错题4:`观察下列方法的定义,则该方法的返回类型为
ReturnType method(byte x, double y) {
   return (short)x/y*2;
} `
      - 原因:在程序中对精度不敏感。
      - 总结:short将byte类型的x强制转化为short类型,但y的精度更高,所以返回类型为double。
- 错题5:`short和Float都属于基本数据类型。`
      - 原因:Float是float提供的封装类,不是基本数据类型。
      - 总结:要看清是大写还是小写。
- 错题6:`“字符类型”中的“字符”指Unicode表中的一个字符。`
      - 原因:概念不清楚
      - 总结:应多看书,从书中寻找答案。

## 结对及互评


- 博客中值得学习的或问题:
    - 要素全面
    - 很认真细致
    - 排版简介美观
- 代码中值得学习的或问题:
    - 代码中文件分类简洁
    - 很认真
    

### 点评过的同学博客和代码

- 本周结对学习情况 
    - [20165230](http://www.cnblogs.com/tiankunye/p/8597777.html)
    - 结对照片
![](https://images2018.cnblogs.com/blog/1047870/201803/1047870-20180322195440783-2088003440.png)

    - 结对学习内容
        - 学习如何使用jdb,在jdb上进行代码调试

    
## 其他

通过这周的考试,发现自己有很多地方不足,特别是在编程这种实践型的操作的时候,显得无从下手,有些无力,其实理论知识和动手操作是两码事,平时应该多动手编程,而不仅仅只是敲书上的代码

## 学习进度条

|            | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| --------   | :----------------:|:----------------:|:---------------:  |:-----:|
| 目标        | 5000行            |   30篇           | 400小时            |       |
| 第四周      | 1105/1300          |   1/2            | 30/90             |       |


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

参考:[软件工程软件的估计为什么这么难](http://www.cnblogs.com/xinz/archive/2011/04/05/2005978.html),[软件工程 估计方法](http://www.cnblogs.com/xinz/archive/2011/04/06/2007294.html)

- 计划学习时间:30小时

- 实际学习时间:18小时

- 改进情况:

(有空多看看[现代软件工程 课件 
软件工程师能力自我评价表](http://www.cnblogs.com/xinz/p/3852177.html))


## 参考资料

-  [Java学习笔记(第8版)](http://book.douban.com/subject/26371167/) 

- [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
posted on 2018-03-22 20:12  musea  阅读(336)  评论(2编辑  收藏  举报