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


    1. 本周学习总结

    2. 书面作业

    Q1.代码阅读:Child压缩包内源代码
    1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。

    Child.java文件如图所示,图示代码中的“System.out.println(i);”报错,则说明这个文件不能编译通过。
    至于原因,首先让我们看看i的出处,Parent.java的代码
    

    从Parent.java之中,我们可以清楚的看到,作为Child的父类,Parent中的i是用private修饰的,因此作为子类的Child无法正常调用i。
    解决方法可以参考j的修饰方法,使用protected进行修饰。
    输出结果为:
    
    1        //来自c.getParenti()
    2        //来自c.getParentj()
    2        //来自System.out.println(i)
    1        //来自System.out.println(super.j)
    1        //来自System.out.println(j)
    2        //来自System.out.println(geti())
    1        //来自System.out.println(super.geti())
    

    1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。

    OutOfParentPackage.java的代码如上图所示。
    会出现的报错为"The type Parent is not visible"
    在我看来,这个文件正如它的文件名,是Out Of Parent Package(在Parent包之外)的。
    而定义Parent包的时候,没有任何修饰方法,那么系统就会默认访问权限为包访问。
    所以,要使得OutOfParentPackage.java能够访问到Parent类,就应该使用public修饰Parent类为公共访问权限。
    但此时仍会报错,问题在于Parent类中,i、j都是用protected(被保护的)方法修饰的。改为public修饰方法应该解决问题。
    

    1.3 回答:如果为了访问到protected修饰的属性或方法应该怎么办?

    最根本的解决方法,就是把OutOfParentPackage.java放入com.parent包中,使其成为Parent类的子类,这样就符合protected的调用条件了。
    

    Q2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码
    2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?

    Guess改造前和改造后的代码如上图所示:
    对比两段代码,改造前,未使用抽象类,只能控制台输出
    改造后,使用抽象类,可以在控制台,也可以使用对话框图形界面等输入
    

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

    写一个图形界面类来继承抽象类GuessGame,然后使用能够调用图形界面的语言来实现改造。
    

    2.3 结合该例子,你觉得什么时候应该使用abstract?

    当某些类中的方法尚未定义,我们可以给它一个抽象的定义
    

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

    变化的是输入方法,或者说是操作平台,可以选择从控制台输入、从对话框图形界面输入等等。
    不变的是这个例子的抽象方法,对于一个游戏来说,它的抽象方法就是游戏规则(从0~9猜一个数字),对于无论何种输入方法,都可以按游戏规则输出其所需结果(猜对了或者猜错了)。
    

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

    此接口强行对实现它的每个类的对象进行整体排序,简要的说就是用于让对象变为可比较的,然后实现对象的比较和排序。
    关于Comarable接口和Arrays.sort的关系,在老师的PowerPoint中有下图的对Arrays的定义和二者的比较:
    


    也就是说,在没有使用Comparable接口的排序类对象是不可以直接传入Arrays.sort进行排序的。
    那么,我们就需要利用Comparable接口实现对对象的"强制转换"。
    

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

    Comparable接口强制排序方式为自然排序,而Comparator接口可以自定义排序方式,在使用上更灵活。
    对于二者使用上的区别,我引用PHP100互联网开发社区对二者的一段比较:
    

    Comparator 和 Comparable 比较
    Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
    而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
    我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

    Q.4面向接口案例分析
    阅读Case-StudentDao.zip案例
    4.1 画出类关系图,描述每个类与接口的作用。

    StudentDao接口:提供三个抽象方法,写入学生数据、读取学生数据和显示所有学生信息。
    StudenDaoListImpl类:用列表来存放学生信息,用ArrayList的方法来完成排序。
    Student类:存放名字,使用了Getter and Setter和toString方法,是StudentDaoArrayImpl类和StudenDaoListImpl类的父类。
    StudentDaoArrayImpl类:readStudent(String) 读取学生信息;diplayAllStudent()遍历整个数组,没找到学生信息返回false,有则输出学生信息。writeStudent(Student )添加学生信息,添加成功后返回true。
    

    4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

    两个类的具体方法不同,StudenDaoListImpl是用ArrayList的方法实现存储,而而StudentDaoArrayImpl是用数组方法实现的。
    

    Q.5什么是面向接口编程?面向接口编程的好处是什么?
    结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!

    以上是我在Q4的Test.java中看到的老师给的注释,由这些注释,引出我个人对面向接口编程的观点。
    ·无需考虑后台数据类型,通过接口进行强制转换(我个人的理解就像要在投影仪上显示笔记本电脑的显示器内容需要VGA-HDMI转接器才能实现)
    ·代码整体比较有框架,结构感强。
    ·同第一点的例子,当投影仪引用电脑显示器时,只是调用了图像,而不会调用电脑的系统,这和接口编程的思想类似,上层和下层的关系只有接口调用,而不调用下层的类。
    
    1. 码云上代码提交记录及PTA实验总结

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

    3.1. 码云代码提交记录

    3.2. PTA实验
    5-1
    此题需要利用Comparable接口对name排序,再重写compareTo方法,对Comparable进行改写,用于对象的名字的排序,调用方法Arrays.sort。

  • 相关阅读:
    初始FreeMake
    C#三层架构
    文件上传
    Jquery动画效果(混合)
    反射机制
    Java使用Sockt进行通信(2)
    Java使用Socket进行通信
    JavaScript基础
    Java的继承
    事物>视图>索引>备份和恢复
  • 原文地址:https://www.cnblogs.com/KILL-ljj/p/6613441.html
Copyright © 2020-2023  润新知