Java设计并实现一个圆锥类,编写java构造方法法,其成员变量为底面半径和高,成员方法有计算底面积和体积在

测试 Java 类的非公有成员变量和方法
引言对于软件开发人员来说,单元测试是一项必不可少的工作。它既可以验证程序的有效性,又可以在程序出现 BUG
的时候,帮助开发人员快速的定位问题所在。但是,在写单元测试的过程中,开发人员经常要访问类的一些非公有的成员变量或方法,这给测试工作带来了很大的困扰。本文总结了访问类的非公有成员变量或方法的四种途径,以方便测试人员在需要访问类非公有成员变量或方法时进行选择。尽管有很多经验丰富的程序员认为不应该提倡访问类的私有成员变量或方法,因为这样做违反了 Java
语言封装性的基本规则。然而,在实际测试中被测试的对象千奇百怪,为了有效快速的进行单元测试,有时我们不得不违反一些这样或那样的规则。本文只讨论如何访问类的非公有成员变量或方法,至于是否应该在开发测试中这样做,则留给读者自己根据实际情况去判断和选择。方法一:修改访问权限修饰符先介绍最简单也是最直接的方法,就是利用 Java 语言自身的特性,达到访问非公有成员的目的。说白了就是直接将 private 和 protected
关键字改为 public 或者直接删除。我们建议直接删除,因为在 Java
语言定义中,缺省访问修饰符是包可见的。这样做之后,我们可以另建一个源码目录 —— test 目录(多数 IDE 支持这么做,如 Eclipse 和
JBuilder),然后将测试类放到 test
目录相同包下,从而达到访问待测类的成员变量和方法的目的。此时,在其它包的代码依然不能访问这些变量或方法,在一定程度上保障了程序的封装性。 下面的代码示例展示了这一方法。清单 1. 原始待测类 A 代码public class A {
private String name =
private void calculate() {
}清单 2. 针对单元测试修改后的待测类 A 的代码public class A {
String name =
private void calculate() {
}这种方法虽然看起来简单粗暴,但经验告诉我们这个方法在测试过程中是非常有效的。当然,由于改变了源代码,虽然只是包可见,也已经破坏了对象的封装性,对于多数对代码安全性要求严格的系统此方法并不可取。方法二:利用安全管理器安全性管理器与反射机制相结合,也可以达到我们的目的。Java
运行时依靠一种安全性管理器来检验调用代码对某一特定的访问而言是否有足够的权限。具体来说,安全性管理器是
java.lang.SecurityManager
类或扩展自该类的一个类,且它在运行时检查某些应用程序操作的权限。换句话说,所有的对象访问在执行自身逻辑之前都必须委派给安全管理器,当访问受到安全性管理器的控制,应用程序就只能执行那些由相关安全策略特别准许的操作。因此安全管理器一旦启动可以为代码提供足够的保护。默认情况下,安全性管理器是没有被设置的,除非代码明确地安装一个默认的或定制的安全管理器,否则运行时的访问控制检查并不起作用。我们可以通过这一点在运行时避开
Java 的访问控制检查,达到我们访问非公有成员变量或方法的目的。为能访问我们需要的非公有成员,我们还需要使用 Java 反射技术。Java
反射是一种强大的工具,它使我们可以在运行时装配代码,而无需在对象之间进行源代码链接,从而使代码更具灵活性。在编译时,Java
编译程序保证了私有成员的私有特性,从而一个类的私有方法和私有成员变量不能被其他类静态引用。然而,通过 Java
反射机制使得我们可以在运行时查询以及访问变量和方法。由于反射是动态的,因此编译时的检查就不再起作用了。下面的代码演示了如何利用安全性管理器与反射机制访问私有变量。清单 3. 利用反射机制访问类的成员变量//获得指定变量的值
public static Object getValue(Object instance, String fieldName)
IllegalAccessException, NoSuchFieldException {
Field field = getField(instance.getClass(), fieldName);
// 参数值为true,禁用访问控制检查
field.setAccessible(true);
return field.get(instance);
//该方法实现根据变量名获得该变量的值
public static Field getField(Class thisClass, String fieldName)
throws NoSuchFieldException {
if (thisClass == null) {
throw new NoSuchFieldException("Error field !");
}其中 getField(instance.getClass(), fieldName) 通过反射机制获得对象属性,如果存在安全管理器,方法首先使用
this 和 Member.DECLARED 作为参数调用安全管理器的 checkMemberAccess 方法,这里的 this 是 this
类或者成员被确定的父类。 如果该类在包中,那么方法还使用包名作为参数调用安全管理器的 checkPackageAccess 方法。
每一次调用都可能导致 SecurityException。当访问被拒绝时,这两种调用方式都会产生 securityexception 异常
。setAccessible(true) 方法通过指定参数值为 true
来禁用访问控制检查,从而使得该变量可以被其他类调用。我们可以在我们所写的类中,扩展一个普通的基本类
java.lang.reflect.AccessibleObject 类。这个类定义了一种 setAccessible
方法,使我们能够启动或关闭对这些类中其中一个类的实例的接入检测。这种方法的问题在于如果使用了安全性管理器,它将检测正在关闭接入检测的代码是否允许这样做。如果未经允许,安全性管理器抛出一个例外。除访问私有变量,我们也可以通过这个方法访问私有方法。清单 4. 利用反射机制访问类的成员方法public static Method getMethod(Object instance, String methodName, Class[] classTypes)
NoSuchMethodException {
Method accessMethod = getMethod(instance.getClass(), methodName, classTypes);
//参数值为true,禁用访问控制检查
accessMethod.setAccessible(true);
return accessM
private static Method getMethod(Class thisClass, String methodName, Class[] classTypes)
throws NoSuchMethodException {
if (thisClass == null) {
throw new NoSuchMethodException("Error method !");
return thisClass.getDeclaredMethod(methodName, classTypes);
} catch (NoSuchMethodException e) {
return getMethod(thisClass.getSuperclass(), methodName, classTypes);
}获得私有方法的原理与获得私有变量的方法相同。当我们得到了函数后,需要对它进行调用,这时我们需要通过 invoke()
方法来执行对该函数的调用,代码示例如下://调用含单个参数的方法
public static Object invokeMethod(Object instance, String methodName, Object arg)
throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Object[] args = new Object[1];
return invokeMethod(instance, methodName, args);
//调用含多个参数的方法
public static Object invokeMethod(Object instance, String methodName, Object[] args)
throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Class[] classTypes =
if (args != null) {
classTypes = new Class[args.length];
for (int i = 0; i & args. i++) {
if (args[i] != null) {
classTypes[i] = args[i].getClass();
return getMethod(instance, methodName, classTypes).invoke(instance, args);
}利用安全管理器及反射,可以在不修改源码的基础上访问私有成员,为测试带来了极大的方便。尤其是在编译期间,该方法可以顺利地通过编译。但同时该方法也有一些缺点。第一个是性能问题,用于字段和方法接入时反射要远慢于直接代码。第二个是权限问题,有些涉及
Java 安全的程序代码并没有修改安全管理器的权限,此时本方法失效。方法三:使用模仿(Mock)对象在单元测试的过程中模仿对象被广泛使用。它从测试中分离了外部的不需要的因素,并且帮助开发人员专注于被测试的功能。模仿对象(Mock
object)的核心是构造一个伪类,在测试中通常用这个构造的伪类替换原来的需要访问相关环境(如应用服务器,数据库等)的需要测试的待测类,这样单元测试便可以运行在本地环境下(这也是对单元测试的基本要求之一,不依赖于任何特定的环境),并可以正确的执行。此外,
由于 Java 语言不能多继承的特性,使得该方法也可以被用来作为非公有成员变量及方法的访问方法(测试类不能同时继承 TestCase
和待测类),利用该方法,在模仿对象中改变类成员的访问控制权限,从而达到访问非公有类变量及方法的目的。下面的代码示例演示了模仿对象方法。本方法的应用场景在单元测试中非常常见,即在待测试的公有方法中,有一些受限制的成员变量是由其它私有方法来初始化的,在测试该方法的时候,需要给这个变量置初值才能完成测试。清单 5. 待测类 Apublic class A {
protected String s =
public A() {
private void method() {
s = "word";
System.out.println("this is mock test");
public void makeWord() {
String prefix =
System.out.println("prefix is:" + prefix);
}在待测类 A 中,增加工厂方法。清单 6. 包含工厂方法的待测类 A// 增加工厂方法的类 A
public class A {
protected String s =
public A getA() {
return new A();
private void method() {
s = "word";
System.out.println("this is mock test");
public void makeWord() {
String prefix =
System.out.println("prefix is:" + prefix);
//伪类,在运行时替换类 A
public class MockA extends A{
public String
public MockA(){
public class TestA extends TestCase{
public void setup(){
public void teardown(){
public void makeWordTest(){
A a = new MockA();
a.s = "test";
a.makeWord();
}此方法中有几个值得注意的地方,首先是将创建代码抽取到工厂方法中,在测试子类中覆盖该工厂方法,然后令被覆盖的方法返回模仿对象。如果可以的话,添加需要原始对象的工厂方法的单元测试,以返回正确类型的对象。模仿对象方法在处理许多对象依赖基础结构的其它对象或层时,
可以起到很好的效果。模仿对象符合实际对象的接口,但只要有足够的代码来“欺骗”测试对象并跟踪其行为。例如,
在单元测试中需要测试一个使用数据库的对象,或者需要测试连接 J2EE
应用服务器的对象,通常的测试用例需要安装、配置和发送本地数据库副本、运行测试然后再卸装本地数据库或者需要安装、配置应用服务器、运行测试然后再卸装应用服务器,操作可能很麻烦,。模仿对象提供了解决这一困难的途径。对于既需要访问相关环境又要访问非公有变量或方法的类来说,模仿对象非常适合,但是,如果只是访问非公有变量或方法,那么传统的模仿对象法显得有些笨重,可以对该法进行简化,不使用工厂方法,达到同样的效果。下面的代码示例演示了经过简化的模仿对象方法:清单 7. 简化的待测类 A 的模仿对象//伪类,在运行时替换类A
public class MockA extends A{
public MockA(){
s = "test";
public class TestA extends TestCase{
public void setup(){
public void teardown(){
public void makeWordTest(){
A a = new MockA();
a.makeWord();
}模仿对象方法既能消除运行环境的影响,又能解决多继承的难题,但是由于该方法使用子类的实例来替代父类的实例,对于私有成员变量及方法来说,仍然不能进行访问。方法四:利用字节码技术Java 编译器把 Java 源代码编译成字节码 bytecode(字节码),既然在测试中尽量要避免改变原来的代码,那么最直接的改造 Java
类的方法莫过于直接改写 class
文件。通过修改字节码中的关键字,将私有的成员变量及方法改成公有的成员变量及方法,可以做到在不改变源码的情况下访问到需要的成员变量及方法。Java
规范有 class 文件的格式的详细说明,直接编辑字节码确实可以改变 Java 类的行为,但是这也要求使用者对 Java class
文件有较深的理解。目前,比较流行的字节码处理工具有 Javassist,BCEL 和 ASM
等。这几种工具各有特点,适合于不同的应用场景,如果读者对字节码技术感兴趣,可以阅读后面的参考文献。本文选择利用字节码工具 ASM。ASM 能被用来动态生成类或者修改既有类的功能。它可以直接产生二进制 class 文件,也可以在类被加载入 Java
虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class
文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM
从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类(.class)。ASM 作为 Java
字节码操控框架,是所有同类工具中效率最高的一个,并且由于其采用了基于 Vistor
模式的框架设计,它也是同类工具中最轻巧灵活的,尽管它的学习台阶相对要高一些,它仍然是达到本文目的的首选。利用 ASM
访问私有变量及方法,需要了解的比较重要的几个类:ClassReader、ClassVistor、MethodVisitor、FieldVisitor
和 ClassAdaptor 等。ClassReader 类可以直接由字节数组或由 class
文件间接的获得字节码数据,它能正确的分析字节码,通过调用 accept 方法接受一个 ClassVisitor
接口的实现类实例作为参数,然后依次调用 ClassVisitor 接口的各个方法;ClassVisitor 接口中定义了对应 Java
类各个成员的访问函数,比如 visitMethod 会返回一个实现 MethordVisitor 接口的实例,visitField 会返回一个实现
FieldVisitor 接口的实例。不同 Visitor 的组合,可以非常简单的封装对字节码的各种修改;ClassAdaptor 类为
ClassVisitor 接口提供了一个默认实现。创建一个 ClassAdaptor 对象实例时,需要传入一个 ClassVisitor
接口的实现类实例来访问字节吗。因此当我们需要对字节码进行调整时,只需从 ClassAdaptor
类派生出一个子类,覆写需要修改的方法,完成相应功能后再把调用传递到下一个需要修改的 visitor 即可。本例的应用场景为,要对公有方法 method() 进行单元测试,但是,该方法中有一个私有变量 number 是由另一个私有方法 makePaper()
付值,所以,需要在测试中为该私有变量置初值。清单 8. 待测类 Aclass A{
private String number = “”;
public void method() {
if(number.eaquals(“prefix”))
System.out.println("method..."+number);
System.out.println(number +”is null”);
private void makePaper() {
number=”prefix”;
System.out.println("makePaper...");
}清单 9. 使用字节码访问类 A//修改变量的修饰符
public class AccessClassAdapter extends ClassAdapter {
public AccessClassAdapter(ClassVisitor cv) {
super(cv);
public FieldVisitor visitField(final int access, String name,
final String desc, final String signature,
final Object value) {
int privateAccess =
//找到名字为number的变量
if (name.equals("number"))
privateAccess = Opcodes.ACC_PUBLIC;
//修字段的修饰符为public:在职责链传递过程中替换调用参数
return cv.visitField(privateAccess, name, desc,
signature, value);
public static void main(String[] args) throws Exception {
ClassReader cr = new ClassReader("A");
ClassWriter cw = new PUTE_MAXS);
ClassAdapter classAdapter = new AccessClassAdapter(cw);
cr.accept(classAdapter, ClassReader.SKIP_DEBUG);
byte[] data = cw.toByteArray();
//生成新的字节码文件
File file = new File("A.class");
FileOutputStream fout = new FileOutputStream(file);
fout.write(data);
fout.close();
}执行完该类,将产生一个新的 A.class 文件。测试类测试 method 方法,先对变量进行置初值,然后就可以像其他单元测试一样,对 method 方法进行测试。方法对比方法修饰符使用难度缺陷protected 缺省private方法一:修改访问权限修饰符是是是低,有java编程基础即可。由于需要修改源代码,虽然是同包可见,也会带来一些封闭性的问题。方法二:利用安全性管理器是是是中,需要了解java安全性管理器及反射机制。一些对代码安全有要求的程序,程序员并没有修改security
manager的权限,此时,安全管理器方法失效。方法三:使用模仿对象是是否较高,需要了解设计模式和待测对象的内部实现细节。由于模仿对象要求伪类必需和待测类是继承与被继承的关系,所以当源码以private关键字修饰时,此方法失效。方法四:利用字节码技术是是是高,需要操作和改写类部分的字节码。学习成本高,需要了解Java字节码技术总结在进行单元测试时,我们要尽可能的考虑代码的移植性和通用性,在不修改源程序的前提下达到测试的最佳效果。对于是否应该使用以及如何使用本文中提到的四种方法,需要开发人员根据具体场合谨慎选择。
相关主题阅读李夷磊等撰写的文章“”(developerWorks,2007 年 7 月)。Peter Haggar 撰写的文章“”(developerWorks,2001 年 7 月)。Alexander Day Chaffee撰写的文章“”(developerWorks,2003年 3月)。:这里有数百篇关于 Java 编程各个方面的文章。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Java technologyArticleID=304315ArticleTitle=测试 Java 类的非公有成员变量和方法publish-date=扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
(用java解决)设计一个圆类,Circle,有表示半径的protected类型的成员变量radius,获取和设置radius值的public方法、计算圆面积的public方法.设计一个表示圆柱体的类Cyliinder,它继承自类Circle,还包含表示圆柱体高的protected类型的成员变量height、获取和设置height值的public方法、计算圆柱体体积public方法.建立若干个Cylinder对象,输出其半径、高及体积的值.要求:1、每个类包含无参数和有参数的构造方法.构造方法用于对成员变量初始化,无参数的构造方法将成员变量初始化为0值.2、子类的构造方法调用父类的构造方法,对父类的成员变量初始化.
沉默军团50290
扫二维码下载作业帮
2亿+学生的选择
class Circle{propublic Circle(){radius=0;}public Circle(double radius) {this.radius =}public double getRadius() {}public void setRadius(double radius) {this.radius =}public double area(){return 3.14*radius*}}class Cyliinder extends Circle{propublic Cyliinder(){height=0;}public Cyliinder(double radius,double height) {super(radius);this.height =}public double getHeight() {}public void setHeight(double height) {this.height =}public double volume(){return area()*}}public class Test {public static void main(String[] args) {//假设半径为3,高为5Cyliinder c1=new Cyliinder(3,5);//输出半径System.out.println(c1.getRadius());//输出高System.out.println(c1.getHeight());//输出体积System.out.println(c1.volume());}}
为您推荐:
其他类似问题
扫描下载二维码面向对象程序设计(java)题库 抽题规范: (1) 此题库共75道题,抽8道作为期末考试题。其中,易8道,较易33道,较难18道,难16道. (2) 按题型,第一大题抽4道,每道10分;第二大题抽2道,每道10分;第三大题抽1道,每道20分;第四大题抽1道,每道20分。 (3) 按难易程度:易(1道)、较易(4道)、较难(2道)、难(1道)。 一、解答题(共40道,抽4道,每道10分,共40分) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 面向对象有哪三大特征? (易) 什么是类? (易) 什么是对象? (易) 类和对象的区别是什么? (较易) 简述Java的封装性,如何在Java中实现封装(较难) 构造方法有哪些特点(较易) 构造方法的作用是什么? (较易) this在程序中所代表的意思(易) 继承的作用是什么? (易) Java支持多继承吗? (易) 子类可以继承父类的哪些成员? (较难) 简述构造子类对象时子类和父类构造方法执行顺序(较易) 什么是方法的重载,如何选择被重载的方法?(较易) 什么是方法的重写,如何选择被重写的方法?(较难) 简述重载和覆盖的区别(较易) 什么是成员的隐藏?如何访问被隐藏了的父类成员?(较易) 简述this和super的区别(较难) 简述面向对象的多态性(较易) 简述实例变量和类变量的区别(较易) 简述静态方法和实例方法的区别(较易) 简述按值传递和按址传递的区别(较难) 什么是抽象类?抽象类中一定有抽象方法吗?(较难) 什么是接口?接口中的成员有什么特点?(较易) 简述抽象类和接口的区别(较易) extends和implements的区别是什么?(较易) final可以用在哪些地方,分别代表什么意思?(较易) static可以用在哪些地方,分别代表什么意思?(较易) 静态代码块的作用是什么?它被执行几次?(较易)
Java中包的作用是什么(易) 在Java中,import和package的区别?(易) public,protected,default,private的区别(较易) 内部类的作用是什么?内部类常用在哪里?(较难) 简述异常处理机制(较难) 简述throw和throws的区别(较易) 35. 36. 37. 38. 39. 40. 简述final和finally的区别(较易) 列出三个常见的异常并说明其作用(较易) 简述String和StringBuffer的区别(较易) 集合Collection包含哪两大子接口?它们的区别是什么?(较易) 如何把一个字节流转换成字符流?(较易) 让一个类成为线程有哪两种方式?(较易) 二、单项编程(共25题,抽2题,每题10分,共20分) 1. 设计一个矩形类,有长和宽两个属性,能够计算每一个矩形的面积和周长;再编写一个主类,在其主方法main中创建一个具体的矩形,求出该矩形的周长和面积。(较易) 2. (1)设计一个圆类,有一个属性半径,能够计算每一个圆的面积和周长;再编写一个主类,在其主方法main中创建一个具体的圆形,求出该圆形的周长和面积。(较易) 3. 设计一个盒子类Box,它有长、宽、高三个私有成员属性,包含无参数和有参数的构造方法,分别实现设置和获取属性的setter和getter方法,以及求盒子体积的公有方法。其中,构造方法用于对成员变量初始化,无参数的构造方法将成员变量初始化为0值。再编写一个主类BoxTest,在其主方法main()中创建若干个Box对象,输出其长、宽、高及其体积的值。(较易) 4. 设计一个人类,有姓名、年龄、性别、身高、体重属性,以及吃饭、穿衣服、跑步行为;再编写一个主类,在其主方法main中创建两个人类对象,并分别为各个对象的属性赋初值,然后打印出各个对象的所有基本信息。(较易) 5. 编写学生类和成绩类。成绩有科目和分数信息。学生有姓名和成绩信息,学生类的getResult()方法显示输出成绩信息,setData()方法实现初始化学生信息。(较难) 6. (1)定义一个动物类Animal,有动物类型属性type和动物发声的方法sound(); (2)定义基于动物类的狗类Dog和猫类Cat,这两个类都要求覆盖父类的发声方法; (3)定义AnimalDemo类,声明一个Animal对象,分别创建一个Dog、Cat类的对象,然后通过Animal对象来访问Dog、Cat类对象的sound()方法。(难) 7. (1)设计一个表示二维平面上圆的类Circle,有表示圆半径的protected类型的成员变量radius、获取和设置radius值的public方法、计算圆面积的public方法。 (2)设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的protected类型的成员变量height、获取和设置height值的public方法、计算圆柱体体积的public方法。 (3)建立若干个Cylinder对象,输出其半径、高及其体积的值。 要求: A、每个类包含无参数和有参数的构造方法。构造方法用于对成员变量初始化,无
参数的构造方法将成员变量初始化为0值。 B、子类的构造方法调用父类的构造方法,对父类中的成员变量初始化。(较难) 8. 请使用继承关系实现下列描述: (较难) 自行车和豪车属于车类型 车(car):车牌号(cid)、车型(dtype)、价值(cvalue) 自行车(bicycle):车牌号(cid)、车型(dtype)、价值(cvalue)、链条(chain) 豪车(limo):车牌号(cid)、车型(dtype)、价值(cvalue)、导航(guide) 9. 使用一个类里面包含其他类的对象的方法实现下列描述:(较难) 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 有1个组长,手下有2个助手,每个助手有2部车。 组长(leader):姓名(lname)、年龄(lage) 助手(asist):编号(aid)、年龄(aage)、姓名(aname)、爱好(ahobby) 车(car):车牌号(cid)、车型(dtype)、价值(cvalue) 使用一个类里面包含其他类的对象的方法实现下列描述:(较难) 有1个人,人有2个宠物且有2部车。 人(people):姓名(pname)、年龄(page) 宠物(pet):编号(petid)、年龄(petage)、姓名(petname) 车(car):车牌号(cid)、车型(dtype)、价值(cvalue) 使用一个类里面包含其他类的对象的方法实现下列描述:(较难) 有1个房间,里面有1个冰箱,冰箱里面有1个饮料 房间有型号和大小2个属性 冰箱有型号、颜色和耗电量3个属性 饮料有类型和价值2个属性 定义抽象的Intrument(乐器)类,声明一个抽象的play();定义一个派生类Stringed(弦类乐器),实现父类的抽象的play()。在main()中实例化Stringed类调用play()。(难) 定义含有抽象方法print()的基类,在构造方法中调用print();print()方法在派生类被重写,该方法打印在派生类中定义的成员变量i,在定义i时给定非零的初始值; 在main()中,创建派生类的对象,然后调用print()。(难) 定义一个接口Myinterface,有两个抽象方法max()和min();在Operation类中实现该接口,同时实现抽象方法max()和min(),它们分别用于求任意三个整数中的最大值和最小值。(难) 定义一个Compute接口,有抽象方法add()、substract()、multiply()和divide();定义一个实现Compute接口的类Computer,然后创建Computer对象完成加、减、乘和除四个方法的调用。(难) 设计一个汽车类Auto,有速度属性speed,另外,有启动state,加速speedup和停止stop方法,然后,设计一个子类Bus表示公共汽车,Bus增加一个属性passenger表示乘客数,另外添加两个方法gotOn和gotOff表示乘客上下车。(较难) 设计一个时间类MyTime,包含一个构造方法,3个私有成员变量hour、minute、second以及它们相应的setter和getter方法,再加上一个转换成“XX时:XX分:XX秒”格式字符串的方法toString。(较易) 设计一个日期类MyDate,包含一个构造方法,3个私有成员变量year、month、day以及它们相应的setter和getter方法,再加上一个转换成“XXXX年XX月XX日” 格式字符串的方法toString。(较易) 实做一个点类Point,包含两个成员变量x,y分别表示x和y坐标,两个构建器Point()和Point(int x0,int y0),以及一个movePoint(int dx,int dy)方法实现点的位置移动。编写一个程序,创建两个Point对象p1,p2,分别调用movePoint方法后,打印p1和P2的坐标。(难) 使用ArrayList添加5个数(如:25、66、88、33、77),求出这5个数的平均数并显示在控制台。(较易) 使用Set添加5个元素(如:a,b,c,d,e),并将全部元素输出到控制台。(较易) 使用Map添加班上5个学生的学号和姓名,在控制台输出这5个学生的学号和姓名信息。(较易) 23. 创建一个图书类Book,其属性有书号id、书名name、作者author和出版社press;再声明三个Book对象并赋值;然后依次用Set、List、Map集合来实现对Book对象数据的存储,并输出相应图书信息(难) 24. 设计一个程序从Thread类派生,用它建立两个线程a和b,a线程每隔0.1秒输出一个字符‘a’,共输出10个‘a’,b线程每隔0.2秒输出一个字符‘b’,也输出10个‘b’。(难) 25. 请计算1~100之间的奇数之和,并实现在屏幕上每2秒钟输出一步计算结果如:(难) 1+3=4 4+5=9 ??
三、类的综合应用(共5道,抽1道,每道20分)
(一)武器问题(较难) 1.定义一个Weapon (武器)抽象类
要求:1)定义两个属性
(1) 武器的名称 name
(2)武器的颜色 color
2)定义一个抽象方法showMe()
2.定义Pistol (手枪) Sword (军刀) Axe (斧头)三个具体的武器类继承Weapon
1)分别重写showMe方法,该方法功能是在控制台显示该武器的信息
注:武器的信息就包括它的名称和颜色 3.定义一个入口类Access 在main方法里面去测试功能
要求: 1) 定义一个List集合
2) 建立上面的三种武器对象各3个,给他们取名字,并且指定颜色
3) 把这些对象放在定义好的List里面
4) 循环这个List取出对象去调用武器类的showMe方法
(二)宠物问题(较难) 1.定义一个Animal(动物)抽象类
要求:1)定义两个属性
(1) 动物的名称 name (String类型)
(2)动物的毛色 color (String类型)
2)定义一个抽象方法showMe()
2.分别定义Cat Dog Snake三个宠物类继承Animal
1)分别重写showMe方法,该方法功能是在控制台显示该宠物的信息
注:宠物的信息就包括它的名称和颜色 3.定义一个入口类Access 在main方法里面去测试功能
要求: 1) 定义一个List集合
2) 建立上面的三种宠物对象各3个,给他们取名字,并且指定毛色
3) 把这些对象放在定义好的List里面
4) 循环这个List取出对象去调用动物类的showMe方法
(三)家具问题(较难) 1.定义一个Furniture (家具)抽象类
要求:1)定义两个属性
(1) 家具的名称 name (String类型)
(2)家具的颜色 color (String类型)
2)定义一个抽象方法showMe()
2.定义Sofa(沙发) Desk(桌子) Chair (椅子)三个具体的家具类继承Furniture
1)分别重写showMe方法,该方法功能是在控制台显示该家具的信息
注:家具的信息就包括它的名称和颜色 3.定义一个入口类Access 在main方法里面去测试功能
要求: 1) 定义一个List集合
2) 建立上面的三种家具对象各3个,给他们取名字,并且指定颜色
3) 把这些对象放在定义好的List里面
4) 循环这个List取出对象去调用家具类的showMe方法
(四)、箱子问题(难) 1.定义一个Box(箱子)类
要求:1)定义一个属性
(1) 箱子容器(用List集合表示) box
提示:用来存放物品 2.定义Apple(苹果)类
要求: 1) 定义两个属性 (1) 苹果的体积
bulk (用float数据类型)
(2) 苹果的颜色
color(用String数据类型)
2) 定义一个方法public void showMe()
该方法功能是在控制台展示苹果的属性 3.在箱子类里面添加几个方法
要求: 1) 建立方法可以往箱子里面放一个苹果
public void putApple(Apple apple)
提示:直接放在List集合里面 2) 建立方法可以在箱子里面取出一个苹果
public Apple getApple()
提示:取的时候注意判断箱子里面是否还有苹果存在
3) 建立方法查看箱子里面还有多少个苹果
public int getSize() 4. 建立一个Access类 在main方法里面创建一个箱子对象和5个苹果对象测试往
箱子里面放苹果取苹果的方法
(五)、子弹发射问题(难) 1.定义一个Pistol (枪)类
要求:1)定义一个属性,弹夹 (用int表示) charger
提示:用来表示当前子弹数量
2) 定义一个方法public void shoot()
该方法的功能是在控制台打印发射两个字,但是需要判断当前弹夹里

我要回帖

更多关于 编写构造方法 的文章

 

随机推荐