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 |
参考资料
-
百度百科
-老师给的博客。