实验二:面向对象编程
一、 实验目的
通过编程和上机实验了解Java语言是如何体现面向对象编程基本思想,熟悉类的封装方法以及如何创建类和对象,熟悉成员变量和成员方法的特性,熟悉类的继承性和多态性的作用,熟悉包、接口的使用方法,掌握OOP方式进行程序设计的方法。
二、 实验要求
1、 编写程序实现类的定义和使用。
2、 编写不同成员和不同成员方法修饰方法的程序。
3、 编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序和多态性(成员方法重载、构造方法重载)的程序。
4、 编写接口的定义和使用的程序。
5、 编写包的定义和使用的程序。
三、 实验内容及运行结果
1、 类的定义和使用
l 定义一个满足如下要求的Date类:
a. 用下面的格式输出日期:日/月/年
b. 可运行在日期上加一天操作
c. 设置日期
用该类编写一个显示当前日期的程序。
l 创建一个桌子Table类,该类中有桌子名称、重量、桌面宽度、长度及桌子高度属性。其中有:
a. 构造函数初始化所有数据成员
b. Area():计算桌面的面积
c. Display():在屏幕上输出所有数据成员的值
d. ChangeWeight(int ):改变桌子重量的函数
e. 在main()中实现创建一个桌子对象,计算桌面的面积,改变桌子重量,并在屏幕上输出所有桌子数据成员的值。
源代码:
class Table
{
private String name;
private double weight;
private double width;
private double length;
private double height;
//构造函数
public Table(String name,double weigth,double width,double length,double height)
{
this.name = name;
this.weight = weight;
this.width = width;
this.length = length;
this.height = height;
}
//计算桌面的面积
public double Area()
{
return width*length;
}
//在屏幕上输出所有数据成员的值
public void Display()
{
System.out.println("桌子的名称: "+name+", "+"重量(kg): "+weight);
System.out.println("桌面的宽度(cm): "+width+", "+"长度(cm): "+length);
System.out.println("桌子的高度(cm): "+height);
}
//改变桌子重量的函数
public void ChangeWeight(double weight)
{
this.weight = weight;
}
}
class TestTable
{
public static void main(String[] args)
{
Table t = new Table("桌神",10,100,60,130);
//计算桌面的面积
System.out.println("桌面的面积为:"+t.Area());
//改变桌子重量
t.ChangeWeight(15);
//在屏幕上输出所有桌子数据成员的值
t.Display();
}
}
运行结果:
2、 修饰符的使用:
有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这时可以使用修饰符来实现这个目的。常用的修饰符如下:public、private、protected、package、static、final、transient、volatile
l 程序功能:通过两个类StaticDemo、TestDemo说明静态变量/方法与实例变量/方法的区别,程序源代码如下:
class StaticDemo
{
static int x;
int y;
public static int getX()
{
return x;
}
public static void setX(int newX)
{
x = newX;
}
public int getY()
{
return y;
}
public void setY(int newY)
{
y = newY;
}
}
public class TestDemo
{
public static void main(String[] args)
{
System.out.println("静态变量x="+StaticDemo.getX());
System.out.println("实例变量y="+StaticDemo.getY());//非法,编译时将出错
StaticDemo a = new StaticDemo();
StaticDemo b = new StaticDemo();
a.setX(1);
a.setY(2);
b.setX(3);
b.setY(4);
System.out.println("静态变量a.x="+a.getX());
System.out.println("静态变量a.y="+a.getY());
System.out.println("静态变量b.x="+b.getX());
System.out.println("静态变量b.y="+b.getY());
}
}
运行结果:
3、 继承和多态的作用
新类可从现有的类中产生并保留现有类的成员变量和方法,并可根据需要对它们加以修改。新类还可添加新的变量和方法,这种现象就称为类的继承。当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类( superclass),这个新类称为子类。
Java提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。
类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。多态使程序简洁,为程序员带来很大便利。在OOP中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。类的多态性体现在方法的重载( overload)上,包括成员方法和构造方法的重载。
l 创建Rodent(啮齿动物):Mouse(老鼠),Gerbil(沙鼠),Hamster(大颊鼠)等的一个继承分级结构。在基础类中,提供适用于所有Rodent的方法,并在衍生类中覆盖它们,从而根据不同类型的Rodent采取不同的行动。创建一个Rodent数组,在其中填充不同类型的Rodent,然后调用自己的基础类方法,看看会有什么情况发生。
源程序:
class Rodent//基础类
{
void nightAction(){
System.out.println("Rodent.nightAction()");
}
}
class Mouse extends Rodent//老鼠类
{
void nightAction(){
System.out.println("Mouse.nightAction()");
}
}
class Gerbil extends Rodent//沙鼠类
{
void nightAction(){
System.out.println("Gerbil.nightAction()");
}
}
class Hamster extends Rodent
{
void nightAction(){
System.out.println("Hamster.nightAction()");
}
}
//测试类
public class RodentTest
{
public static void main(String[] args){
Rodent[] rt = new Rodent[4];//创建一个Rodent数组
rt[0] = new Rodent();
rt[1] = new Mouse();
rt[2] = new Gerbil();
rt[3] = new Hamster();
for(Rodent rodent:rt){
rodent.nightAction();
}
}
}
运行结果:
4、 接口的定义和使用
Java中的接口在语法上有些类似于类,它定义了若干的抽象方法和常量,形成一个属性集合,该属性集合通常代表了某一功能的实现。它的主要作用是可以帮助我们实现类似于类的多重继承的功能。Java中各类获取某一接口定义的功能,并不是通过直接继承这个接口中的域和方法来实现的,因为接口中的域都是常量,接口中的方法都是没有方法体的抽象方法,也就是说,接口定义的仅仅是实现某一特定功能的功能接口和规范,而并没有真正的实现这个功能,这个功能的真正实现实在“继承”了这个接口的各个类中完成的,有这些类来具体定义接口中各抽象方法的方法体。故在Java中,通常把对接口功能的“继承”称为实现。
Java中声明接口的语法如下:
[public] Interface接口名[extends父接口名列表]
{ //接口体:
//常量域声明
[public] [static] [final]域类型 域名=常量值;
//抽象方法声明
[public] [abstract] [native]返回值方法名(参数列表)[throw异常列表];
}
某个类为接口中的抽象方法书写语句并定义实在的方法体,称为该类实现可这个接口。
● 程序如下:
public class InterfaceTest
{
public static void main(String args[])
{ double x;
circle y=new circle(2);
//y.cirdle(2);
x=y.calculate_atea();
System.out.println( "面积为:"+x);
}
}
interface cal_area
{
double PI=3.14;
public double calculate_atea();
}
class circle implements cal_area
{
double r;
circle(double r)
{
this.r=r;
}
public double calculate_atea()
{
return PI*r*r;
}
}● 编译并运行上述程序。
5、 包的定义和使用
●创建自定义包Mypackage
在存放源程序的文件夹中建立一个子文件夹Mypackage。例如,在“E:\java\程序”文件夹之中创建一个与包同名的子文件夹Mypackage(E:java程序\Mypackage),并将编译过的class文件放入该文件夹中。注意:包名与文件夹名大小写要一致。再添加环境变量classpath的路径,例如:E:\j2sdkl.4.2_01\lib;E:\java\程序
● 在包中创建类
YMD.java程序功能:在源程序中,首先声明使用的包名Mypackage,然后创建YMD类,该类具有计算今年的年份并输出一个带有年月日的字符串的功能。源代码如下
package Mypackage; //声明存放类的包
import java.util.*; //引用java.util包
public class Test_YMD
{
private int year,month, day;
public static void main(String[] arg3)
{}
public Test_YMD(int y, int m, int d)
{
year=y;
month=(((m>=1)&(m<=12))?m:1);
day=(((d>=1)&(d<=31))?d:1);
}
public Test_YMD()
{
this(0,0,0);
}
public static int thisyear()
{
return Calendar.getInstance().get(Calendar.YEAR);//返回当年的年份
}
public int year()
{
return year;//返回年份
}
public String toString()
{
return year+"-"+month+"-"+day;//返回转化为字符串的年-月-日
}
} 编译Test_YMD.java文件,然后将Test_ YMD.class文件存放到Mypackage文件夹
● 编写使用包Mypackage中Test_YMD类的程序
YMD_2.java程序功能:给定某人姓名与出生日期,计算该人年龄,并输出该人姓名,年龄,出生日期。程序使用了Test_YMD的方法来计算年龄。源代码如下:
import Mypackage.Test_YMD;//引用Mypackage包中的Test_YMD类
public class YMD_2
{
private String name;
private Test_YMD birth;
public static void main(String args[])
{
YMD_2 a=new YMD_2("白若男",1990,1,11);
a.output();
}
public YMD_2(String n1,Test_YMD d1)
{
name=n1;
birth=d1;
}
public YMD_2(String n1,int y,int m,int d)
{
this(n1,new Test_YMD(y,m,d));//初始化变量与对象
}
public int age() //计算年龄
{
return Test_YMD.thisyear()-birth.year();//返回当前年与出生年的差即年龄
}
public void output()
{
System.out.println("姓名:"+name);
System. out.println("出生日期:"+birth.toString());
System. out.println("今年年龄:"+age());
}
}编译并运行程序。
实验二:java程序设计
一、实验目的与要求
1、了解Java 的数据类型;
2、掌握各种变量的声明方式;
3、理解运算符的优先级;
4、掌握Java 基本数据类型、运算符与表达式、数组的使用方法;
5、理解Java 程序语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法;
6、通过以上内容,掌握Java 语言的编程规则。
二、实验内容
读入一个浮点数值,将其转换为中文金额的大写方式,如123.45,转换为:壹佰贰拾叁元肆角伍分。要求:
(1)当金额为整数时,只表示整数部分,省略小数部分,并添加“整”字。例如,123表示为:壹佰贰拾叁元整;
(2)当金额中含有连续的0时,只需写一个“零”即可,例如, 10005表示为:壹万零伍元整;
(3)10的表示方式,例如,110元表示为:壹佰壹拾元整,而10则表示为:拾元整。 提示:将字符串型转换为浮点型可以用Float.parseFloat(s)函数转换。
三、实验器材
微机+windows操作系统+eclipse
四、实验步骤
1、程序代码
import java.io.*;
import java.util.Scanner;
public class ee {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /** * 数据输入 */ System.out.println("请输入一个实数"); InputStream is=System.in; Scanner scan=new Scanner(is); float y=scan.nextFloat(); System.out.println("y="+y); float x=y; int ix=(int)x;//整数部分
float px=x-ix;//小数部分 String cx=ix+""; String cy=px+""; /** * 处理整数部分,采用二进制转换思想 */ int []zhengshu=new int[cx.length()]; int i=0; if(cx.length()<=4) { } /** * 整数钱币输出 */ for(int ii=cx.length()-1;ii>=0;ii--) { if(zhengshu[ii]==0) { if(ii!=0) { } if(ii==0) { System.out.print("圆"); if(zhengshu[ii-1]!=0) { System.out.println("零"); } while(ix>0) { } zhengshu[i]=ix-ix/10*10;//求出余数,并赋给数组zhengshu i++; ix=ix/10;//商
}
}
if(zhengshu[ii]!=0) { if(ii==3) { if(zhengshu[ii]==1) System.out.print("壹仟"); if(zhengshu[ii]==2) System. if(zhengshu[ii]==3) System. if(zhengshu[ii]==4) System. if(zhengshu[ii]==5) System. if(zhengshu[ii]==6) System. if(zhengshu[ii]==7) System.
if(zhengshu[ii]==8) System. if(zhengshu[ii]==9) System. }
if(ii==2) { if(zhengshu[ii]==1) System. if(zhengshu[ii]==2) System. if(zhengshu[ii]==3) System. if(zhengshu[ii]==4) System. if(zhengshu[ii]==5) System. if(zhengshu[ii]==6) System. if(zhengshu[ii]==7) System.
if(zhengshu[ii]==8) System. if(zhengshu[ii]==9) System. }
if(ii==1) { if(zhengshu[ii]==1) System. if(zhengshu[ii]==2) System. if(zhengshu[ii]==3) System. if(zhengshu[ii]==4) System. if(zhengshu[ii]==5) System. if(zhengshu[ii]==6) System. if(zhengshu[ii]==7) System.
if(zhengshu[ii]==8) System. if(zhengshu[ii]==9) System. }
if(ii==0)
{
out.print("贰仟"); out.print("叁仟"); out.print("肆仟"); out.print("伍仟"); out.print("陆仟"); out.print("柒仟"); out.print("捌仟");
out.print("玖仟"); out.print("壹佰"); out.print("贰佰"); out.print("叁佰"); out.print("肆佰"); out.print("伍佰"); out.print("陆佰"); out.print("柒佰"); out.print("捌佰");
out.print("玖佰"); out.print("壹拾"); out.print("贰拾"); out.print("叁拾"); out.print("肆拾"); out.print("伍拾"); out.print("陆拾"); out.print("柒拾"); out.print("捌拾");
out.print("玖拾");
} if(zhengshu[ii]==1) System.out.print("壹圆"); if(zhengshu[ii]==2) System.out.print("贰圆"); if(zhengshu[ii]==3) System.out.print("叁圆"); if(zhengshu[ii]==4) System.out.print("肆圆"); if(zhengshu[ii]==5) System.out.print("伍圆"); if(zhengshu[ii]==6) System.out.print("陆圆"); if(zhengshu[ii]==7) System.out.print("柒圆"); if(zhengshu[ii]==8) System.out.print("捌圆"); if(zhengshu[ii]==9) System.out.print("玖圆"); } } /** * 处理小数部分 */ float yushu; int xiaoshu[]=new int[2]; xiaoshu[0]=(int)(px*10); yushu=px*10-xiaoshu[0]; xiaoshu[1]=(int)(yushu*10); if(xiaoshu[0]!=0) { if(xiaoshu[0]==1) System.out.print("壹角"); if(xiaoshu[0]==2) System.out.print("贰角"); if(xiaoshu[0]==3) System.out.print("叁角"); if(xiaoshu[0]==4) System.out.print("肆角"); if(xiaoshu[0]==5) System.out.print("伍角"); if(xiaoshu[0]==6) System.out.print("陆角"); if(xiaoshu[0]==7) System.out.print("柒角"); if(xiaoshu[0]==8) System.out.print("捌角"); if(xiaoshu[0]==9) System.out.print("玖角"); } else { } if(xiaoshu[1]!=0) { if(xiaoshu[0]==0) { } if(xiaoshu[1]!=0) System.out.println("零");
} } if(xiaoshu[1]==1) System.out.print("壹分"); if(xiaoshu[1]==2) System.out.print("贰分"); if(xiaoshu[1]==3) System.out.print("叁分"); if(xiaoshu[1]==4) System.out.print("肆分"); if(xiaoshu[1]==5) System.out.print("伍分"); if(xiaoshu[1]==6) System.out.print("陆分"); if(xiaoshu[1]==7) System.out.print("柒分"); if(xiaoshu[1]==8) System.out.print("捌分"); if(xiaoshu[1]==9) System.out.print("玖分"); }
五、实验结果
请输入一个实数
34.678
y=34.678
叁拾肆圆陆角柒分
请输入一个实数
123.23
y=123.23
壹佰贰拾叁圆贰角叁分
请输入一个实数
110.00
y=110.0
壹佰壹拾圆
六、实验小结
1、通过这个实验巩固了java的基础知识:包括数据类型、变量的声明方式、运算符的优先级、表达式的应用、数组的使用。
2、熟练了程序的控制结构:顺序结构、选择结构和循环结构,并在实验中得以使用。
3、了解了java的编程规则。
4、综合应用所学知识完成java程序的分析、设计、调试和总结;为以后编写更复杂的java程序打下了很好的基础。
实验报告计算机与信息工程学院实验中心学期20xx20xx课程名称Java程序设计实验班级信息1202姓名方逸梅学号12121002…
Java语言程序设计实验报告实验序号3一实验目的及要求1进一步熟练Java语法和常用方法的使用2进一步熟练Java程序结构3进一步…
信息工程学院Java程序设计实习报告JAVA图形用户界面实验六Java图形用户界面1实验目的1掌握图形用户界面基本组件2了解如何使…
JAVA课程标准实验报告学号1040501211姓名陈嘉生江苏科技大学计算机科学与工程学院基础部1实验一流程控制语句一实验目的12…
浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称Java语言基础实验学生姓名专业班级学号一实验目的和要求1掌握Java…
北京联合大学信息学院“面向对象程序设计”课程上机实验报告题目:JAVA上机实验心得体会姓名(学号):专业:计算机科学与技术编制时间…
Homework3实验报告一实验目的与要求1掌握Java中类和接口的基本知识2继承的基本知识3集合的基本操作二实验内容1PIMCo…
浙江理工大学Java程序设计实验报告20xx20xx学年第二学期学院班级姓名学号任课教师信息学院11数字媒体技术2周咪咪20xx3…
JAVE实验报告学号姓名班级指导教师129074401李阳网124柯栋梁安徽工业大学计算机学院20xx年1月实验一利用JAVA反射…
Java课程设计报告学号姓名班级指导教师129074068叶玉虎计122班柯栋梁安徽工业大学计算机学院20xx年12月实验一利用J…
辽宁建筑职业学院Java高级应用实训报告课题名称婚庆公司网站专业软件技术班级xxxxxxxxxx学号姓名xxxx指导教师xxx二O…