实验2 面向对象编程
一、实验目的和要求
(1)熟练掌握Java语言类定义的基本语法; (2)熟练掌握类成员的访问控制,对象建立的方法; (3)熟练掌握类构造方法、成员方法的定义和重载; (4)熟练掌握类继承、多态和抽象性; (5)熟练掌握接口的定义和实现方法; (6)掌握基本的异常处理方法;
(7)调试程序要记录调试过程中出现的问题及解决办法;
(8)编写程序要规范、正确,上机调试过程和结果要有记录,不断积累编程及调试经验;
(9) 做完实验后给出本实验的实验报告。
二、实验仪器和设备
奔腾以上计算机,Windows 操作系统,装有JDK1.6和Eclipse4.2软件。
三、实验过程
(1)定义一个Man类,保存在Man.java文件中,类中包含说话方法如下: public class Man { public void say() { System.out.println(“我是中国人!”); } }
为此类打包为cn.edu.jit.chinese;再在Man.java文件所在路径下,创建一个China.java文件,其中定义China类如下: public class China { public static void main(String[] args) { Man lihua = new Man(); lihua.say(); } } 在China类中引用Man类,输出显示“我是中国人!”。试着去掉Man类的public修饰,看看会发生什么情况?
(2)设计复数类,成员变量包括实部和虚部,成员方法包括实现复数加法、减法、字符串描述、比较是否相等等操作。
14
(3)包的建立与使用:设计计算器类Calculator,计算加、减、乘、除和立方体体积,并且打包为mypackage。观察源文件目录下是否生成了mypackage文件夹,在该文件夹中是否有Calculate.class文件。编辑PackageDemo.java,保存在Calculator.java同一目录下,引用计算器类的各方法显示计算结果。
(4)试编码实现简单的银行业务:处理简单帐户存取款、查询。编写银行帐户类BankAccount,包含数据成员:余额(balance)、利率(interest);操作方法:查询余额、存款、取款、查询利率、设置利率。再编写主类UseAccount,包含main()方法,创建BankAccount类的对象,并完成相应操作。
(5)假定根据学生的3门学位课程的分数决定其是否可以拿到学位,对于本科生,如果3门课程的平均分数超过60分即表示通过,而对于研究生,则需要平均超过80分才能够通过。根据上述要求,请完成以下Java类的设计: 1)设计一个基类Student描述学生的共同特征。
2)设计一个描述本科生的类Undergraduate,该类继承并扩展Student类。 3)设计一个描述研究生的类Graduate,该类继承并扩展Student类。
4)设计一个测试类StudentDemo,分别创建本科生和研究生这两个类的对象,并输出相关信息。
(6)设计三角形类,继承图形抽象类,计算三角形面积和周长。
(7)试编码实现多态在工资系统中的应用:给出一个根据雇员类型利用abstract方法和多态性完成工资单计算的程序。Employee是抽象类,Employee的子类有Boss(每星期发给他固定工资,而不计工作时间)、CommissionWorker(除基本工资外还根据销售额发放浮动工资)、PieceWorker(按其生产的产品数发放工资)、HourlyWorker(根据工作时间长短发放工资)。该例的Employee的每个子类都声明为final,因为不需要再继承它们生成子类。在主测试类Test中测试各类雇员工资计算结果。
提示:对所有雇员类型都使用earnings()方法,但每个人挣的工资按他所属的雇员类
计算,所有雇员类都是从超类Employee派生出的。在超类中声明earnings()为抽象方法,并且对于每个子类都提供恰当的earnings()的实现方法。为了计算雇员的工资,程序仅仅使用雇员对象的一个超类引用并调用earnings()方法。在一个实际的工资系统中,各种Employee对象的引用可以通过一个Employee引用数组来实现。程序依次使用数组的每个元素(Employee引用)调用每个对象的earnings()方法。 Employee类定义如下: abstract class Employee {
private String firstName; private String lastName;
public Employee(String first,String last) {
15
firstName=first; lastName=last; }
public String getEmployeeName() {
return firstName; }
public String getLastName() {
return lastName; }
public String toString() {
return firstName+lastName; }
public abstract String earnings(); }
(8)设计圆柱体类和圆椎体类,继承圆类Circle并实现体积接口Volume,计算表面积和体积。
(9)定义一个接口CanFly,描述会飞的方法public void fly();分别定义飞机类和鸟类,实现CanFly接口。定义一个测试类,测试飞机和鸟。测试类中定义一个makeFly(CanFly obj)方法,让会飞的事物飞起来(即调用相应类的fly()方法)。然后在main方法中创建飞机对象和鸟对象,并在main方法中调用makeFly(CanFly obj)方法,让飞机和鸟起飞。
(10)异常的捕获:计算两数相除并输出结果。使用三个catch子句,分别捕捉输入输出异常、除数为0的异常和参数输入有误异常。 import java.io.*; class Ex1 {
public static void main(String args[ ]) {
try{
BufferedReader strin=new BufferedReader(
new InputStreamReader(System.in));//建立输入流缓冲区 System.out.print(\请输入除数:\
String cl=strin.readLine();//键盘输入 int a=Integer .parseInt(cl);
System .out .print(\请输入被除数:\ cl=strin .readLine();
int b=Integer .parseInt(cl); int c=b/a;
System .out .println(\商为:\ }
//捕获与I/O有关的异常(空白处补全捕获语句)
16
//捕获数值转化时的异常,如不能将字符转化成数值
//捕获除数为0的异常 } }
编译并运行,当产生输入输出异常时显示异常信息;当输入除数为0时,出现算术异常,提示除数为0,并要求重新输入;当输入的不是整数时,如将30输成了3o,出现数值格式异常,提示输入整数。
(11)编写程序包含自定义异常MyException,当100被13和4除时抛出该异常,其余除数显示商值。
要求:
(1) 注意选用适当的类成员修饰符(private、protected、public等),比较它们的使
用情况;
(2) 养成良好的编程习惯,严格按照命名规则为包、类及类成员命名,将每个程序打包,
包的命名方式如two.num1表示实验二的第一题;
(3) 学会使用Eclipse的各种调试方法;
(4) 学会查阅Java API文档,如查找异常类的使用方法。
程序清单:
(建议程序中适当添加注释信息,增强可读性;较长程序可分栏书写,保证报告排版整洁美观。) (1) package cn.edu.jit.chinese;// 为Man类打包为cn.edu.jit.chinese
public class Man { public void say() {
System.out.println(\我是中国人!\ } }
package cn.edu.jit.chinese;
import cn.edu.jit.chinese.*; //导入包
public class China {
public static void main(String[] args) {
Man lihua = new Man();//主方法先创建类然后调用类 lihua.say(); } }
(2)public class Complex {
private double real,image; //定义私有的real,image public Complex(double real,double image)
17
{this.real=real; //赋值
this.image=image;} public Complex(double real) {this(real,0);} public Complex() {this(0,0);}
public Complex(Complex c) {this(c.real,c.image);} public double getReal() {return real;}
public void setReal(double real) { this.real = real;}
public double getImage() { return image;}
public void setImage(double image) { this.image = image;}
public Complex add(Complex c1,Complex c2)//写方法
{Complex C=new Complex(c1.real+c2.real,c1.image+c2.image); return C;}
public Complex add(Complex c1) {Complex C=new
Complex(this.real+c1.real,this.image+c1.image); return C; }
public Complex jian(Complex c1,Complex c2)
{Complex C=new Complex(c1.real-c2.real,c1.image-c2.image); return C; }
public Complex jian(Complex c1)
{Complex C=new Complex(this.real-c1.real,this.image-c1.image); return C; }
public boolean bijiao(Complex c1,Complex c2)
{return (c1.real==c2.real&&c1.image==c2.image); }
public boolean bijiao(Complex c1)
{return (c1.real==this.real&&c1.image==this.image); }
public String toString()
{return this.real+\}
public class ComplexText {
public static void main(String[] args) {
Complex c1=new Complex(2,5); //创建类,调用类里面的方法
18