1. 编程题目概况
这是Java编程思想(第四版)第十五章中的编程作业题第8题, 原文如下:
练习8. 模仿Coffee示例的样子, 根据你喜爱的电影人物, 创建一个StoryCharacters的类层次结构, 将它们划分为GoodGuys和BadGuys. 再按照CoffeeGenerator的形式, 编写一个StoryCharacters的生成器.
我没有用题目说的方法来实现, 而用其它方式. 我也实现了一个随机生成各种汽车的生成器. 也不知道有没有达到题目中的要求, 但这并不是重点, 我只是想用这个作业题写一些基本java中的概念给初学者看看.我这里只是自己对一些基本概念的小总结. 不全是肯定的, 有误解也是可能的.不过为了写这文章, 我也重新理了一下一些概念. 既是自已的小总结, 也希望对初学者有些初步认识.
说一下java编程思想这本书很厚, 达到了880页, 拿在手上看像拿个砖头一样重. 它里面编程题多达几百道, 每一章动不动就40道编程题, 量是真大. 好像一共有四五百道编程题, 我只想说如果所有章节都完成所有编程题, 并且独立完成, 这不仅仅是一个脑力劳动, 更是个体力劳动. 要阅读完这本书要有一定的毅力.
2. 代码实现
下面是 Car.java 代码文件中的内容, 代码主要对一些java基本概念描述:
/*import是java中用于导入包,类,接口的语句*/
/*下面是导入java.util包中所有类和接口*/
/*星号表示通配符,代表全部*/
import java.util.*;
/*interface表示一种接口,接口是java中用于声明*/
/*一堆方法,不过只有方法名,不能给出实现,类可以*/
/*实现某接口,并且可实现多个接口,而继承则不可以*/
/*java只能单继承类,而不能像c++可继承多个类*/
/*这里的T表示泛型类型,即可以是任何类类型*/
/*只要实现这个Generator接口,这个T可以是任何类*/
/*类型,但注意是必需要实现next方法,并且返回类*/
/*型也要一致*/
interface Generator<T> { T next(); }
/*java中万物皆类, 像c中的函数只要用()符号*/
/*前面加个函数名就调用,java中所有函数都位*/
/*于类中,也称之为方法.*/
/*关于static方法*/
/*有一种方法前面有static关键字修饰,表示静*/
/*态方法,它表示这个方法的代码在内存中只存*/
/*有一份,我们创建一个类对象就生成一份这个*/
/*类声明的所有数据和方法的代码,可以创建很*/
/*多类对象,但是这个static方法仅此一份.它也*/
/*不属于任何类对象,而只属于类,我们可以用类*/
/*名加此静态方法象调用*/
/*关于static变量*/
/*和static方法类似,它不属于任何创建的类对象*/
/*只属于类本身,可以用类名加变量直接访问*/
/*普通变量和方法与static变量和方法区别*/
/*普通方法和成员变量必需创建类实例调用,而*/
/*static方法和变量可通过类名直接访问*/
/*声明并定义一个汽车类*/
class Automobile {
/*counter用于统计创建了多少对象(实例)*/
/*counter这里主要给每个对象赋值为其创*/
/*建的顺序编号*/
private static long counter = 0;
/*final数据类型是java中的一种一旦初始化就不可*/
/*改变的*/
private final long id = counter++;
/*toString方法是继承自Object,所有类都支持*/
/*当打印自定义类时,将自动调用这个方法,这个*/
/*方法将出自定义类的字符串表示,一般要自己*/
/*重写*/
public String toString() {
/*getClass方法用于获取一个class对象,*/
/*class对象可以获得它所属类的信息,如*/
/*类名,这里getName方法就是用class对象*/
/*获取类的名称*/
return getClass().getName() + " " + id;
}
}
/*声明一个GermanCar类继承自Automobile*/
/*extends是java中类继承的关键字*/
/*这里的GermanCar主要作用也不是要用于*/
/*创建类对象,而是用作类别划分*/
class GermanCar extends Automobile {}
/*后面全部是继承自GermanCar的派生类*/
class Volkswagen extends GermanCar { }
class Benz extends GermanCar { }
class BMW extends GermanCar { }
class Audi extends GermanCar { }
class Porsche extends GermanCar { }
class Maybach extends GermanCar { }
/*这是另一个同GermanCar不同的继承*/
/*体系的类*/
class JapanCar extends Automobile {}
/*这些都是另一条继承体系的派生类*/
class Toyota extends JapanCar { }
class Honda extends JapanCar { }
class Nissan extends JapanCar { }
class SUZUKI extends JapanCar { }
class Subaru extends JapanCar { }
class Maxda extends JapanCar { }
/*CarGenerator类实现了Generator和Iterable两个接口*/
/*implements关键字在java中用于实现interface接口*/
/*Generator是自定义接口,里面有个next方法,必需要在*/
/*CarGenerator中实现.Iterable是标准库中的接口,它有*/
/*一个iterator()方法,返回一个Iterator<T>对象,这里返*/
/*回Iterator<Automobile>对象,可用于遍历集合中的元素*/
/*像什么List/Set/Queue/Map这些各种容器都是集合*/
class CarGenerator implements Generator<Automobile>, Iterable<Automobile> {
private Class<?>[] types = {
Toyota.class, Honda.class, Nissan.class,
SUZUKI.class, Subaru.class, Maxda.class,
Volkswagen.class, Benz.class, BMW.class,
Audi.class, Porsche.class, Maybach.class
};
/*随机数对象rd,生成随机数*/
private static Random rd = new Random();
/*默认构造函数*/
/*java中默认构造函数就是不带参数的构造函数但*/
/*c++中可以是不带参数的也可以是带参数的但所*/
/*有参数都有默认值*/
public CarGenerator() {}
private int size = 0;
/*带参构造函数*/
public CarGenerator(int sz) { size = sz; }
/*实现Generator接口的next方法*/
/*这里主要用上面的types数组中的class对象调用newInstace创*/
/*建新的随机的Automobile的子类的对象,newInstance也是调用*/
/*的无参构造函数,即默认构造函数,如果没有这个默认构造方法*/
/*就要用getDeclaredConstructor调用有参的构造方法*/
/*rd.nextInt生成一个types数组长度值中任意的随机数,表示选*/
/*择任意一个class对象,neInstace返回的是Object类型所以要用*/
/*Automobile转换*/
public Automobile next() {
try {
return (Automobile)types[rd.nextInt(types.length)].newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/*内部类又是和接口一样在java中的重要概念*/
/*这里不作过多解释*/
/*用一个内部类CarIterator实现Iterator接口,并实现Iterator*/
/*接口中的hasNext,next方法,然后对外CarGenerator类的iterator*/
/*方法将可以创建一个用于遍历CarGenerator类的定制版迭代器*/
/*所谓定制版迭代器就是Iterator<Automobile>类型的迭代器,专*/
/*门用于来遍历CarGenerator这个自定义类的.*/
/*这个内部类CarIterator就是用于实现这个自定义版迭代器,但*/
/*因为CarIterator实现了Iterable<Automobile>接口,所以必需*/
/*实现iterator()方法,这个方法就是创建一个定制版迭代器*/
class CarIterator implements Iterator<Automobile> {
int count = size;
public boolean hasNext() { return count > 0; }
public Automobile next() {
count--;
return CarGenerator.this.next();
}
};
/*实现Iterable<Automobile>接口中的iterator方法*/
/*用内部类CarIterator的对象实现*/
public Iterator<Automobile> iterator() {
return new CarIterator();
}
}
/*java中的函数入口在和类文件名一致的那个类中的main*/
/*方法中,即即这里的Car.java中Car类中的main方法.java中*/
/*甚至允许在同一个java文件中有多个main函数,不像c/c++*/
/*只能有一个,但java中多个main只有一个是程序执行的入口*/
/*即同文件名一致的那个主中的main*/
/*java中main是个静态方法,string数组args存放了命令行中*/
/*输入的参数,从args[0]开始*/
public class Car {
public static void main(String[] args) {
/*System.out.println是打印加换行*/
System.out.println();
/*创建一个CarGenerator对象*/
CarGenerator ge = new CarGenerator();
/*调用next方法生成一个随机的汽车Automobile类型*/
for (int i = 0; i < 10; i++) {
/*没有ln表示没有换行符打印*/
/*调用next生成一个Automobile对象并打印*/
/*这里就会调用CarGenerator的toString方法*/
/*如果不重写toString方法,将无法打印自定义的类*/
System.out.print(ge.next() + " ");
}
System.out.println();
/*创建一个指定大小的CarGenerator并遍历打印*/
/*这里因为构造函数指定了大小为10,所以fo循环中迭代器*/
/*遍历的大小也就为10个,这种for循环不同于普通for,它*/
/*会自动调用迭代器遍历,不用你手动声明创建迭代器,但*/
/*这个类必需实现迭代器*/
for (Automobile a : new CarGenerator(10)) {
System.out.print(a + " ");
}
System.out.println("\n\nDone.\n");
}
}
运行结果:
3. 结语
终于是写完了, 一下就是几个小时过去了, 其实还真是个体力活. 虽然现在python什么的很火, java不再像以前那么火, 但它依然有其强大生命力. 学好java也是一条好的就业门路.
喜欢就点赞收藏, 你们的点赞和收藏是我创作的动力, 谢谢.
标签:Java,接口,CarGenerator,extends,第四版,java,方法,class From: https://blog.csdn.net/losangelx/article/details/145169906