首页 > 编程语言 >Java编程思想第四版第十五章第8题(java中的一些基本概念)

Java编程思想第四版第十五章第8题(java中的一些基本概念)

时间:2025-01-17 12:29:10浏览次数:3  
标签:Java 接口 CarGenerator extends 第四版 java 方法 class

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");
	}
}

运行结果:

fd841b09601849728b58605be3cb1e29.jpeg

3. 结语

终于是写完了, 一下就是几个小时过去了, 其实还真是个体力活. 虽然现在python什么的很火, java不再像以前那么火, 但它依然有其强大生命力. 学好java也是一条好的就业门路.

喜欢就点赞收藏, 你们的点赞和收藏是我创作的动力, 谢谢.

标签:Java,接口,CarGenerator,extends,第四版,java,方法,class
From: https://blog.csdn.net/losangelx/article/details/145169906

相关文章

  • Sample Teamcenter SOA Java program : CreateOrUpdateBOMStructure
    SampleTeamcenterSOAJavaprogram:CreateOrUpdateBOMStructure  Solution/* This example was tested with the SOAJava HelloTeamcenter example provided in the soa_client.zip file.It assumes you have the HelloTeamcen......
  • 大数据学习记录,Java基础(6)
    集合Java集合框架体系Java集合可分为Collection和Map两种体系:Collection接口:单列数据,定义了存取一组对象的方法的集合List:元素有序、可重复的集合Set:元素无序、不可重复的集合Map接口:双列数据,保存具有映射关系“key-value对”的集合Collection接口的方法add......
  • 大数据学习记录,Java基础(5)
    常用类objectobject类是Java中所有类的共同父类Object类的方法1.toString()默认情况下,toString()返回的是“对象的运行时类型@对象的hashCode值的十六进制形式"如果我们直接System.out.println(对象),默认会自动调用这个对象的toString(),打印的是地址值可以根据需要在用......
  • 基于JAVA中的spring框架和jsp实现驾驶知识学习和评测系统项目【附项目源码+论文说明】
    摘要在21世纪这个信息高度发达,并且高速流通的时代,计算机的普及以及计算机网络技术的应用,让大量普通人能够有机会接触到比以往更多的知识。作为一个以传播知识为主要职能的机构——学校,建立一个自己的精品课程网站是十分必要的事情,这不仅能使更多的人享用宝贵的教育资料源,同时......
  • 大数据学习记录,Java基础(5)
    常用类objectobject类是Java中所有类的共同父类Object类的方法1.toString()默认情况下,toString()返回的是“对象的运行时类型@对象的hashCode值的十六进制形式"如果我们直接System.out.println(对象),默认会自动调用这个对象的toString(),打印的是地址值可以根据需要......
  • 大数据学习记录,Java基础(6)
    集合Java集合框架体系Java集合可分为Collection和Map两种体系:Collection接口:单列数据,定义了存取一组对象的方法的集合List:元素有序、可重复的集合Set:元素无序、不可重复的集合Map接口:双列数据,保存具有映射关系“key-value对”的集合Collection接口的方......
  • 基于JAVA中的spring框架和jsp实现大学生综合测评系统项目【内附项目源码+论文说明】
    摘要大学生综合测评系统是一款以大学生德智体等综合成绩进行评测的系统, 其开发基于B/S模式的网上评测的实现,采用的是JSP+sqlserver数据库为主要模式。在线评测平台是凌架于互联网系统上的一个评测平台,是地面评测系统的一种延伸和互补,也是实现无纸化评测的主要工具。当下在......
  • Java中String类常用的各种方法
    Java中String类常见的方法以下介绍字符串常见的几个方法。介绍String类在Java中,String类是一个代表字符串的类,具有以下特性:不可变性:String对象一旦被创建就是不可变的,即它们的值在创建后不能被更改。任何对String对象的修改操作实际上会创建一个新的String对象。......
  • Java百万数据导出Excel性能优化[读(并发)写分离/流式查询]
    参考:https://www.zhihu.com/tardis/bd/art/533753443?source_id=1001 Java百万数据导出Excel性能优化[读(并发)写分离/流式查询]结果测试:104万数据,导出excel用时由59秒优化到19秒问题列表:1、导出过程中会较多占用CPU、内存、磁盘,需全局对Excel导出限流,防止同时对大量数......
  • JAVA开源免费项目 基于Vue和SpringBoot的城镇保障性住房管理系统(附源码)
    本文项目编号T122,文末自助获取源码\color{red}{T122,文末自助获取源码}......