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

1. 本周学习总结

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

1109839-20170325131650940-2036737657.png


2. 书面作业

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

1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。

1109839-20170325133021361-2040094074.png

答:不能通过编译,从上图可以看到public void getParenti()这条语句出现了问题语句显示The field Parent.i is not visible.原因是因为父类中的i是用修饰符private,只能在自己的类中使用,不能在其他类中调用;可以将private改成protected;

运行结果:1109839-20170325133729236-434735517.png

c.getParenti();输出父类中的i也就是1,c.getParentj();输出super.j,j,geti(),super.geti(),也就是2 2 1 1,Other.showParentj(p);输出父类中的j和i 就是2 1;所以运行结果就是1 2 2 1 1 2 1.

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

答:不能通过编译,显示错误The type Parent is not visible,因为Parent前未加任务修饰符,修饰符为默认而OutOfParentPackage在外包使用,所以就不能使用Parent的方法。要修改的话在Parent类的前面加上public即可。 System.out.println(p.j);改成p.get(j).

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

答:protected的访问范围是本类,同一个包或是子类,所以要访问protected修饰的属性或方法可以在同一个类中调用protected修饰的属性或方法

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

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

//改造前
package cc.openhome;

import java.util.Scanner;

public class Guess {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = (int) (Math.random() * 10);
        int guess;
        
        do {
            System.out.print("猜数字(0 ~ 9):");
            guess = scanner.nextInt();
        } while(guess != number);
        
        System.out.println("猜中了...XD");
    }
}
//改造后
package cc.openhome;

public class Guess {
    public static void main(String[] args) {
        GuessGame game = new ConsoleGame();//这边使用了抽象类GuessGame
        game.go();
    }
}

//GuessGame.java
package cc.openhome;

public abstract class GuessGame {
    public void go() {
        int number = (int) (Math.random() * 10); 
        int guess;
        do {
            print("输入数字:");
            guess = nextInt();
        } while(guess != number);
        println("猜中了");
    }
    
    public abstract void print(String text);
    public abstract void println(String text);
    public abstract int nextInt();
}
答:可以看出,在未改造前,未使用抽象类,只能在控制台输出。在改造后,使用抽象类,可以在控制台,也可以使用对话框图形界面等输入,给人多种的方式选择输入,不必只局限于控制台输出。

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

答:可以使用java.awt和swing包来设计图形界面。

AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT由Java中的java.awt包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件。Swing是一个用于开发Java应用程序用户界面的开发工具包。以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。

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

答:abstract用于抽象类,抽象方法指的是只有声明而没有方法。例如求图形面积的时候,有各种各样的图形,但它们都有一个求面积的方法,这时候就可以用到抽象类。或者未来要需要这种方法是,可以先使用抽象方法。

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

答:在这个例子中变化的是运行环境,不变的是猜数字这个游戏。使用了abstract进行编程就可以在不同平台运行,它会根据用户实际的情况而改变。但是继承就是子类复用了父类的方法。

Q3. Comparable与Comparator

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

// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
    for (int i=low; i<high; i++)
        for (int j=i; j>low &&
                 ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
            swap(dest, j, j-1);
    return;
}

// Merge sorted halves (now in src) into dest
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
    if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
        dest[i] = src[p++];
    else
        dest[i] = src[q++];
}
答:Arrays有一方法 public static void sort(Object[] a)功能:对指定对象数组按升序进行排序, 数组中的所有元素都必须实现 Comparable 接口。因为sort源代码中运用到了(Comparable)这是一个类型指派,也就是说要转化成Comparable才能正确使用该方法。然而如果一个类并没有去操作Comparable接口,它就不能被正确的指派。

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

答:compareTo()方法是放在对象类里面的,在集合内部实现compareTo()的方法。Comparator是在集合外部实现的排序,compare()是放在比较对象的类外面的。当对象不支持自比较函数或者自比较函数不满足要求时(即不能通过Comparable实现对象的排序),可以写一个比较器来完成两个对象之间大小的比较。

Q4. 面向接口案例分析

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

1109839-20170325145831893-983922252.png

  • Student类:提供属性name。
  • StudentDao接口:提供三个抽象方法,写入学生数据、读取学生数据和显示所有学生信息。对于写入学生数据,通过一个boolean变量来判断是否写入成功。
  • StudentDaoArrayImpl类:用数组来存放学生信息,具体实现接口的三个抽象方法,读取学生信息,如果找不到返回null;如果遍历整个数组,没找到学生信息返回false。显示所有学生信息则要求对象都是非空的。然后还有一个构造器,提前根据用户的输入开对应长度的数组。
  • StudenDaoListImpl类:用列表来存放学生信息,具体实现接口的三个抽象方法。

    4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

答:两种方法实现的结果相同但是StudentDaoArrayImpl是用数组来存储学生,此存储方式有个弊端就是学生的数量一开始就要决定,有可能造成数量的过少浪费内存或数量过多而无法存储学生;StudenDaoListImpl使用ArrayList来存储学生,可以随意增加空间。

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

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

题目3用到了两个接口,分别是Comparable和Comparator。通过这两个接口,我们可以很方便的对数据进行比较,并且比较规则可以根据自己想要的方式进行。题目4,类似于一个存放学生数据的数据库。在这个Test类里面,我们只要做的就是确定数据到底是以何种数据结构来存放。这些都是一开始从设计之初就相好的。
接口就是系统设计规范应是定义与实现分离。
接口的好处就是可以不用提供实现细节,而只是提供该接口应该具备怎样的行为,或者说具有什么方法. 

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

内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。

写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面

形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。

注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。

6.1

黄绍桦学生B项目地址
https://www.cnblogs.com/huangsh/https://git.oschina.net/huangsh1/test.git

6.2
1109839-20170325171413705-1990608871.png

6.3

import java.util.*;

public class Product {
    private String productName;// 商品名称
    private double price;// 单价

    public Product() {// 无参构造
        super();
    }

    public Product(String productName, double price) {
        super();

        this.productName = productName;

        this.price = price;
    }

    @Override
    public String toString() {
        return "Product [productName=" + productName + ", price=" + price + "]";
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public class ProductItem extends Product {
        private int count;// 商品数量

        public double totalMoney() {// 小计
            double price = super.getPrice();// 获取商品单价
            return price * count;
        }

        public ProductItem() {
            super();
        }

        public ProductItem(int count) {
            this.count = count;
        }

        public int getCount() {
            return count;
        }

        public void setCount(int count) {
            this.count = count;
        }

    }

    public interface Shop {// 接口

        public void shopcar1(List<ProductItem> com);// 购物车一览
    }

    public class Cart implements Shop {

@Override
            public void shopcar1(List<ProductItem> com) {// 购物车一览
                // TODO Auto-generated method stub
                for (ProductItem p : com) {
                    // TODO Auto-generated method stub
                    System.out.println("商品名" + p.getProductName() + "数量" + p.getCount() + "总价" + p.totalMoney());

                }
                            
                            }

6.4 运行界面
(电脑里编译出错)


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

3.1 码云代码提交记录

1109839-20170325174146361-992262383.png

3.2 PTA实验总结

  • 5-1 Arrays.sort不能对自定义对象进行排序。实现Comparable接口建立类实现Comparable接口 语法:[修饰符] class 类名 implements{};
  • 5-2 Comparator是在集合外部实现的排序,compare()是放在比较对象的类外面的。需要另写类来实现。
  • 接口匿名内部类,直接调用接口方法,语法 Interface i=new Interface{抽象方法};
posted on 2017-03-25 18:43  Paparazzi 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/huangsh/p/6616921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值