201521123083《Java程序设计》第5周学习总结

1. 本周学习总结

1.1 尝试使用思维导图总结有关多态与接口的知识点。

1109845-20170325134429143-963533776.jpg

1.2 可选:使用常规方法总结其他上课内容。

2. 书面作业

1. 代码阅读:Child压缩包内源代码

1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
错误点原因修改
System.out.println(i);i来源于父类,父类于private,不可调用最好将父类的变量i改为protect(public也行,protect更能体现封装性)

结果:1 1 2 1

1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
错误点原因修改
showParentj(Parent p)parent这个类不是public,因此只能在同一个包中调用将parent改为public
p.j or p.geti()即使parent是public,这两个也不可以调用,因为protect修饰的只允许同一个包或者不同包的子类调用最好把变量改private,为其设置public的getter和setter,不要直接调用这个变量,只调用getter和setter
1.3 回答:如果为了访问到protected修饰的属性或方法应该怎么办?

成为他的子类,就可以访问到,因为protected修饰的属性或方法只允许同一个包或者不同包的子类调用。

2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码

2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?

提供了更多的弹性,比如说我现在并不知道以后的需求,我游戏做好之后并不知道到底要在控制台下输出还是要在GUI下输出,甚至在web下输出。
那假如我现在把他写死了,变成控制台下输出,那以后的修改就很大了,甚至要来修改以前的源码,修改以前的源码的影响会很大,很多人已经在调用了,你修改源码可能造成
很多人程序出错,因此,我们尽量不要修改以前源代码,最好的做法就是把实现抽象,以后不管在控制台还是web界面输出,只要继承一下就好。

2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?

重写一个类GuiGame继承GuessGame。然后重写函数,然后调用的时候改成GuessGame game = new GuiGame();
我用swing简单实现了一个。以下是效果图。
1109845-20170324232729190-894794333.jpg

源码(GuiGame以及Game,限于篇幅,MyFrame就不贴出来了):

public class GuiGame extends GuessGame {
    private MyFrame frame;
    public GuiGame() {
    frame = new MyFrame();
    frame.setVisible(true);
}
@Override
public void print(String text) {
    frame.Jprint.setText(text);
    
}

@Override
public void println(String text) {
        frame.Jprintln.setText(text);
        
    }

    @Override
    public int nextInt() {
        int n=0;
        try{
            n= Integer.parseInt(frame.textField.getText());
        }catch(Exception e){
            
        }
        return n;
    }
}


public class Guess {
    public static void main(String[] args) {
    //GuessGame game = new ConsoleGame();
    //game.go();
        GuessGame game = new GuiGame();
    game.go();
    }
}
2.3 结合该例子,你觉得什么时候应该使用abstract?

在项目有重大弹性的时候,比如某些因素无可预料的时候,可以先把这些因素抽象化

2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。

变化的是输入输出,不变的是逻辑,游戏逻辑

3.Comparable与Comparator

3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?

Comparable就是为了让某些类具有可比性,我们知道int型可比较,因为他们有比较的对象,比如5>4.但是对象就不一定了。比如person对象,有身高,体重,但是我们要比较两个person对象的大小
,系统怎么知道到底是要比较什么,身高还是体重,甚至谁先诞生,因此实现了Comparable接口,就能让系统比较的时候有个可以比较的东西,比较的逻辑处理在compareTo函数里面实现。

3.2 有了Comparable接口为什么还需要Comparator接口呢?

比如人可以比较体重,我们可以单纯compareTo里面重写人和人比较体重,猪也要和人比较,没事,急需些,但是猴子等等,那要处理的就很多了,这时候可以写个Comparator接口,
里面逻辑处理,不管什么类,只要是比较体重,就在比较大小的时候调用他,,不仅可以缩小person等类的compareT逻辑处理,还可以省很多代码,每个类都不要实现Comparable接口,只要要排序的时候传入实现这个接口的类就行了就可以。

4. 面向接口案例分析

阅读Case-StudentDao.zip案例

4.1 画出类关系图,描述每个类与接口的作用。

UML图如下:
1109845-20170325124204143-1087347087.jpg

这个程序里面最小的单位是单独定义的一个类Student其他都是以这个类以最小单位去操作。
主要有接口StudentDao。他定义如何写,如何读以及如何展示学生列表。
有两个类StudentDaoArrayImpl以及StudenDaoListImpl。实现了接口StudentDao。不过实现的过程不同。一个是以列表(可变数组),另一个却是以数组来储存学生列表。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

实现的过程不同。一个是以列表(可变数组),另一个却是以数组来储存学生列表。

5. 什么是面向接口编程?面向接口编程的好处是什么?

结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!

面向接口编程就是先把项目需求提取出来,作为接口。具体实现通过该接口的实现类来完成。当需求变化时,只需编写该需求的新的实现类,通过更改该接口的实现类就可以完成需求,不需要改写现有代码,减少对系>统的影响。 采用基于接口编程的项目,业务逻辑清晰,代码易懂,方便扩展,可维护性强。即使新来的人依然可以快速上手。对于分工开发来说,意义很大。比如第三题的,猜数字这个游戏的逻辑已经写好了,我们把>要在哪里实现这部分需求提取出来,作为接口,以后需求变化时,只需要重新实现这个接口就行,不用改写以前的源代码。

6. 结对编程:面向对象设计(大作业2-非常重要)

第6题提交作业的结构:

6.1

学生项目地址
博客地址码云地址

6.2 常用功能描述框架图

1109845-20170325195658065-358680451.jpg

6.3 关键代码

public void addMerchandise(Merchandise merchandise){
        merchandiselist.add(merchandise);
    }
    public void removeMerchandise(Merchandise merchandise){
        merchandiselist.remove(merchandise);
    }
    public void clearMerchandise(){
        merchandiselist.clear();
    }
    public Merchandise findMerchandise(String merchandiseName){
        for (Merchandise merchandise : merchandiselist) {
            if(merchandise.getName().equals(merchandiseName)){
                return merchandise;
            }
        }
        return null;
    }
    @Override
    public String toString() {
        return merchandiselist.toString();
    }
    

6.4 运行界面

1109845-20170325195723924-435365302.jpg

3. 码云上代码提交记录及PTA实验总结

题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类

3.1. 码云代码提交记录

  • 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
    1109845-20170325195825596-742919645.jpg

3.2. PTA实验

  • 4-1
    题目不理解,未实现
  • 5-1&5-2
    在实现Comparable或者Comparactor接口实现CompareTo方法的时候,其他系统是根据返回的数的正负来判断大小的,不是1,-1,0.
    刚好,1,-1,0刚好对应,因此不用选择语句有选择性返回,比如比较人的年龄,只需要return this.age-other.age这样就行了;

转载于:https://www.cnblogs.com/daizhibin/p/6613773.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值