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

教材学习内容总结

一. 理解封装、继承、多态的关系

封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。是软件设计模块化、软件复用和软件维护的一个基础。

继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。java中的继承要使用extends关键字,并且java中只允许单继承,也就是一个类只能有一个父类。

多态,把子类对象主观的看作是其父类型的对象,那么父类型就可以是很多种类型。实现多态,有二种方式,覆盖,重载。

关系:继承可以复用代码,更大的用处是实现「多态」
封装是继承的基础,继承是多态的基础
「用父类声明对象引用,用子类生成对象」就有了多态

二.理解抽象类与接口的区别

1.抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

2.抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

三.掌握S.O.L.I.D原则

S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是:

The Single Responsibility Principle(单一职责SRP)

The Open/Closed Principle(开闭原则OCP)

The Liskov Substitution Principle(里氏替换原则LSP)

The Interface Segregation Principle(接口分离原则ISP)

The Dependency Inversion Principle(依赖反转原则DIP)

四.了解模式和设计模式

模式:模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。模式必须使得问题明晰,阐明为什么用它来求解问题,以及在什么情况下有用,什么情况下不能起作用,每个模式因其重复性从而可被复用,本身有自己的名字,有可传授性,能移植到不同情景下。模式可以看作对一个问题可复用的专家级解决方法。

设计模式:计模式有四个基本要素:

Pattern name:描述模式,便于交流,存档
Problem:描述何处应用该模式
Solution:描述一个设计的组成元素,不针对特例
Consequence:应用该模式的结果和权衡(trade-offs)

五.能正确覆盖方法

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

六.了解垃圾回收机制

垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。

1.引用计数:是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。

2.跟踪收集器:早期的JVM使用引用计数,现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。

七.掌握Object类

Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类。  Object类是Java中唯一没有父类的类。
 其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。

八.掌握enum

分享链接:

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

一.对于JAVA的学习中,我感觉还是通过代码才能更好理解,比如理解封装,继承,多态,例如以下代码:

用java做一个简单计算器;

import java.io.*;

class OperationAttridute

{

   private double numberA=0;

   private double numberB=0;

   private double result=0;

   public double setNumberA(double i)

   {

          return numberA=i;

   }

   public double getNumberA()

   {

          return numberA;

   }

   public double setNumberB(double j)

   {

          return numberB=j;

   }

   public double getNumberB()

   {

          return numberB;

   }

   public double setResult(double z)

   {

          return result=z;

   }

   public double getResult(double a,double b)

   {

          return result;

   }

}

//将要运算的2个数字和运算结果进行封装。

class OperationA extends OperationAttridute

{

   public double getResult(double a,double b)

   {

          double result=0;

          result=a+b;

          return result;

   }    

}

//加法类:继承OperationAttridute类并且覆盖其getResult方法

class OperationS extends OperationAttridute

{

   public double getResult(double a,double b)

   {

          double result=0;

          result=a-b;

          return result;

   }

}

//减法类:继承OperationAttridute类并且覆盖其getResult方法

class OperationM extends OperationAttridute

{

   public double getResult(double a,double b)

   {

          double result=0;

          result=a*b;

          return result;

   }

}

//乘法类:继承OperationAttridute类并且覆盖其getResult方法

class OperationD extends OperationAttridute

{

   public double getResult(double a,double b)

   {

          double result=0;

          if(b==0)

          {

                 Throw new RuntimeException(“被除数不能为0”);

          }

          result=a/b;

          return result;

   }

}

//除法类:继承OperationAttridute类并且覆盖其getResult方法,除法要对被除数进行判断并抛出异常

class Operationdo

{

   public static Object expression_r(char r)

   {

          OperationAttridute oa=new OperationAttridute();       

          switch(r)

          {

                 case '+':

                 oa=new OperationA();                

                 break;

                 case '-':

                 oa=new OperationS();                 

                 break;

                 case '*':

                 oa=new OperationM();         

                 break;

                 case '/':

                 oa=new OperationD();         

                 break;                  

          }

          return oa;             

   }

}

//运算类:通过传进来的参数,来调用运算方法

class Account

{

   public static void main(String []args)throws Exception

   {

          char r='*';                   

          OperationAttridute oa=(OperationAttridute)Operationdo.expression_r(r);

          double a=oa.setNumberA(9);

          double b=oa.setNumberB(2);

          System.out.println(oa.getResult(a,b));  

   }

}

//主程序
这样,只需要输入运算符号,通过多态,返回父类的方式实现了计算器的结果。

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

  • xx1问题
  • xx1解决方案
  • xx2问题
  • xx2解决方案
  • ...

代码托管

  • 代码提交过程截图:
    • 运行 git log --pretty=format:"%h - %an, %cd : %s" 并截图
  • 代码量截图:
    • 运行 find src -name "*.java" | xargs cat | grep -v ^$ | wc -l 并截图

上周考试错题总结

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/4 10/10
第二周 90/100 1/5 12/22
第三周 120/320 1/6 16/38
第四周 180/500 1/7 14/52

参考资料

 posted on 2017-03-19 23:39  20155327李百乾-  阅读(308)  评论(1编辑  收藏  举报