1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结。#
2.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路并画出类图。#
类图如下
设计思路:就是汽车统一链接到租赁公司的接口,之后抽象类一一去继承重写get存货量的方法。
3.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果#
这个程序是不可以通过的明显着有着错误
interface 的定义形式为
interface{
全局常量;
抽象方法;
{
而且其中的抽象方法一定是public的形式是不可以更改的。
程序可以修改成这个样子
interface Animal{
public abstract void breathe();
public abstract 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 class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
抽象类的定义就错了,应该是public abstract void 变量名称(类型)的形式。
4.运行下面的程序#
运行的结果为
apple
banana
orange
peach
这里内置默认使用的是Arrays.sore()方法进行的数组之间的排序,之所以将String类的字符串进行排序就是默认将字符串的第一的字母的ASCII码值进行排序,如果想要按照别的方法进行排序,则就可重写Arrays方法。
String的源码为
首先String类是final的(final 关键字用于类说明该类是不能被继承的)
类属性
private final char value[];//这是用于存储String字符的数组
private final int offset;//这是value数组的第一个有效的字符的index
private final int count;//这是String中的字符个数
private int hash; // 存储String的hashcode,默认是0
下面开始介绍String的构造函数
public String()//默认的构造函数,因为String字符串是不可变的,所以没有必要使用
{
offset = 0;
count = 0;
value = new char[0];
}
public String (String str){//使用已存在的字符串创建一个相同字符序列的字符串
//Unless an explicit copy of original is needed, use of this constructor is
//unnecessary
//代码
获取str的长度,int size = str.count;
将str的字符序列拷贝到新的数组 char[] strValue = str.value;
char[] v;
if(strValue数组长度 > size){
int off = str.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
}
else{
v = strValue ;
}
this.offset = 0;
this.count = size;
this.value = v;
}
下面给出 copyOfRange 函数的代码:
public static char[] copyOfRange(char[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
char[] copy = new char[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
下面是使用char字符数组来初始化String的构造函数
public String(char value[]) {
this.offset = 0;
this.count = value.length;
this.value = StringValue.from(value);
}
在上面的代码中,有一个StringValue类:
class StringValue {
private StringValue() { }
/**
* Returns a char array that is a copy of the given char array.
*/
static char[] from(char[] value) {
return Arrays.copyOf(value, value.length);
}
}
通过这个类可以清楚地看到value是怎么从参数传过来的
逆序排列1为:
import java.util.Arrays;
public class Test{
public static void main(String[] args){
String[] fruits = {"peach","banana","orange","apple"};
String temp;
Arrays.sort(fruits);
for(int i = 0;i < fruits.length;i++)
{
System.out.println("升序排列为:"+fruits[i]);
}
for(int j=0;j<fruits.length-1;j++){
for(int k=0;k<fruits.length-j-1;k++){
if(fruits[k].compareTo(fruits[k+1])<0){
temp=fruits[k];
fruits[k]=fruits[k+1];
fruits[k+1]=temp;
}
}
}
for(int i=0;i<fruits.length;i++){
System.out.println("降序排列为:"+fruits[i]);
}
}
}
或者逆序排列2为
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]);
}
}
}
实验内容:1.某工厂生产各种音乐盒,客户无需知道音乐盒的制作过程,只需知道如何播放音乐盒即可。用简单工厂设计模式实现该过程:接口MusicBox具有方法play(),两个音乐盒类PianoBox,ViolinBox,MusicBoxFactory 产生MusicBox的实例。2.修改第三次作业的第一题,使用java.util.Date类表示职工的生日和参加工作时间,并将职工信息按照生日大小排序后输出。(分别用comparable和comparator实现)3.在案例宠物商店的基础上,实现以下功能:(1)展示所有宠物(2)购买宠物(3)显示购买清单
程序设计思路:第二题利用简单的比较器进行比较。实际上comparable和comparetor感觉上是大同小异,里面的内容交换的机制实际是大同小异的。
问题1:如何将字符串的日期进行比较大小
原因:不理解带有字符串的日期格式的日期如何进行比较大小
解决方案:根据老师给的实例还有上课讲的,可以把日期形式的字符串转化成Date类再用try catch进行捕捉,利用其中Date类里面的 gettime()可以进行比较大小。
程序设计思路:第三题宠物商店的形式和简单的工厂设计的形式上是类似的,分别有一个Cat类,Dog,公共属性的接口,Pet商店类,还有一个测试类
问题1:不知道该如何判断宠物商店里面是否有这个宠物,一直用if也太繁琐了
原因:用户需要去选宠物,就要在宠物中去搜索,用到搜索就得有判断条件是否存在
解决方案:看书上利用了字符串的indexof(String),在一个循环里面,如果有这个字符串,就是满足条件。