Java第五次作业
(一)学习总结
1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。
参考资料: XMind
2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图.
工具:PowerDesigner
参考教程:UML 简介
设计思路:
抽象类汽车租赁公司:属性有:编号();名称();租金();
接口1:定义载货量方法:载货量();
接口2:定义载客量方法:载客量();
子类客车继承汽车租赁公司特有属性:载客量,继承接口2。
子类货车继承汽车租赁公司特有属性:载货量,继承接口1。
子类货车继承汽车租赁公司特有属性:载客量,载货量,继承接口1和2。
3.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果`
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
void eat(){
System.out.println("I'm eating");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
代码中的Dog没有添加实现的方法, 接口的抽象方法虽然默认为public权限,但是实现接口的类中覆写的抽象方法必须写public应该改为:
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
public void eat(){
System.out.println("I'm eating");
}
public void run() {
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
改之后运行结果为
I'm breathing
I'm eating
4.运行下面的程序
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String[] fruits = {"peach","banana","orange","apple"};
Arrays.sort(fruits);
for(int i = 0;i < fruits.length;i++)
{
System.out.println(fruits[i]);
}
}
}
程序输出的结果是升序排序的。查看String 类的源码,说明是如何实现的?如果现在希望对输出的结果进行降序排序,该如何处理?修改上述代码,实现按照字母顺序逆序排序。
查看String源码:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final int offset;
private final int count;
public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
}
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
对源码的解释:
写String类的有参构造时,定义String对象original,声明新数组originalValue,排序时,如果originalValue长度大于original调用的count,对originalValue排列,排列后数组给新数组v,否则将originalValue赋给另一个数组v,输出进行逆序输出
修改后的代码为
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String[] fruits = { "peach", "banana", "orange", "apple" };
Arrays.sort(fruits);
for (int i = fruits.length-1; i >= 0; i--) {
System.out.println(fruits[i]);
}
}
}
运行结果
peach
orange
banana
apple
5.其他知识总结
向上转型:静态方法可以直接用类名调用
Object类:
public Object()是构造方法;
public booean equals(Object )
obj)对象比较
public String toString ();在检查程序或对对象打印时调用
异常的捕获及处理
异常可以用try...catch进行处理,也可以用try...catch...finaiiy进行处理,在try语句中捕捉异常,然后再catch种处理异常,finaiiy作为异常的统一出口,不管是否发生异常都要执行此段代码;throws用在方法声明处,表示本方法不处理异常;throw表示在方法中手工抛出一个异常类;自定义异常类时,只需要继承Exception类即可。
(二)实验总结
(1)某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。
程序设计思路:创建一个抽象方法,然后创建两个类去继承他,为了避免过多的代码重复,设置一个工厂类,当类增加时,只改变工厂类.
2.部门员工类
程序设计思路:
创建Dept类,存在编号,姓名的属性,与员工类进行联系,存在员工类的对象与对象数组
创建员工类,存在编号,姓名,性别的属性,根据题目要求,增加Dept类
在数组的调用方面还是会调用不过来,程序没有错误i,可是没有显示调用数组,
解决的方法:利用捕获异常try -catch-final,捕获异常就是用try()语句中的代码可能会产生并抛弃一个或多个异常,catch语句是进行捕获时做相应的处理。final语句是为异常处理提供一个统一的出口。
3.在案例宠物商店的基础上,实现以下功能:
(1)展示所有宠物
(2)购买宠物
(3)显示购买清单
设计思路:
将动物类定义为抽象的类,类中的属性有颜色,年龄,价格,再定义猫和狗的类,猫和狗的类分别继承动物类并有各自的属性编号,瓶品种,再Pet类中将所有的宠物信息录入,用String类中的ToString输出所有宠物,在用户选择购买宠物中实现Custer类:属性:名字,购买的宠物,构造方法:无参构造方法和有参构造方法,各个属性的getter和setter方法,购买宠物存储的方法 public void addPet();购买的方法;统计购买的数量,价钱:count int,初始化方法:public void init(),显示购买的宠物狗的品种,数量,价钱合计,宠物猫的品种,数量,价钱合计,最后将两者的价钱合计加起来即为购买的宠物的总价钱。
遇到的问题:
思路中的数组的传参,价格的统计计算功能比较难实现,遇到的问题还很多,测试类中输出有错.
(三)代码托管
- 码云commit历史截图
(四)学习进度条
代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
---|---|---|---|
目标 | 5000行 | 300小时 | |
第2-4周 | 300/300 | 30/30 | 学习了.... |
第59周 | 400/400 | 21/30 | |
第610周 |