实验四
类与对象、继承
【目的】
①使用类来封装对象的属性和功能;
②掌握类变量与实例变量,以及类方法与实例方法的区别;
③掌握使用package和import语句。
④巩固以下概念:
子类的继承性
子类对象的创建过程
成员变量的继承与隐藏
方法的继承与重写
【内容】
1.三角形、梯形和圆形的类封装
²
实验要求:
编写一个Java应用程序,该程序中有3个类:Trangle、Leder和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。具体要求如下:
a)
Trangle类具有类型为double的三个边,以及周长、面积属性,Trangle类具有返回周长、面积以及修改三个边的功能。另外,Trangle类还具有一个boolean型的属性,该属性用来判断三个属能否构成一个三角形。
b)
Lader类具有类型double的上底、下底、高、面积属性,具有返回面积的功能。
c)
Circle类具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能。
²
程序运行效果示例:
程序运行效果如下图所示:
²
程序模板:
AreaAndLength.java
class Trangle
{
double
sideA,sideB,sideC,area,length;
boolean boo;
public
Trangle(double a,double b,double c)
{
sideA=a;
sideB=b;
sideC=c; //参数a,b,c分别赋值给sideA,sideB,sideC
if(a+b>c&&a+c>b&&b+c>a)
//a,b,c构成三角形的条件表达式
{
boo=true; //给boo赋值。
}
else
{
boo=false; //给boo赋值。
}
}
double getLength()
{
///方法体,要求计算出length的值并返回
if(boo)
{
length=sideA+sideB+sideC;
return length;
}
else {
System.out.println("不是一个三角形,不能计算周长");
return 0;
}
}
public
double getArea()
{
if(boo)
{
double p=(sideA+sideB+sideC)/2.0;
area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC)) ;
return area;
}
else
{
System.out.println("不是一个三角形,不能计算面积");
return 0;
}
}
public void setABC(double
a,double b,double c)
{
sideA=a;
sideB=b;
sideC=c; //参数a,b,c分别赋值给sideA,sideB,sideC
if(a+b>c&&a+c>b&&b+c>a)
//a,b,c构成三角形的条件表达式
{
boo=true; //给boo赋值。
}
else
{
boo=false; //给boo赋值。
}
}
}
class Lader
{
double
above,bottom,height,area;
Lader(double a,double b,double h)
{
above=a;
bottom=b;
height=h; //方法体,将参数a,b,c分别赋值给above,bottom,height
}
double
getArea()
{
area=(above+bottom)/2*height;
return area;
//方法体,,要求计算出area返回
}
}
class Circle
{
double
radius,area;
Circle(double r)
{
radius=r; //方法体
}
double
getArea()
{
return
Math.PI*radius*radius;//方法体,要求计算出area返回
}
double
getLength()
{
return
Math.PI*2*radius;//getArea方法体的代码,要求计算出length返回
}
void
setRadius(double newRadius)
{
radius=newRadius;
}
double
getRadius()
{
return radius;
}
}
public class AreaAndLength
{
public
static void main(String args[])
{
double length,area;
Circle circle=null;
Trangle trangle;
Lader lader;
circle= new Circle(10); //创建对象circle,参数为10
trangle=new Trangle(3,4,5); //创建对象trangle。
lader=new Lader(3,4,10) //创建对象lader
length=circle.getLength(); // circle调用方法返回周长并赋值给length
System.out.println("圆的周长:"+length);
area=circle.getArea();// circle调用方法返回面积并赋值给area
System.out.println("圆的面积:"+area);
length=trangle.getLength(); //
trangle调用方法返回周长并赋值给length
System.out.println("三角形的周长:"+length);
area=trangle.getArea(): //
trangle调用方法返回面积并赋值给area
System.out.println("三角形的面积:"+area);
area=lader.getArea(); //
lader调用方法返回面积并赋值给area
System.out.println("梯形的面积:"+area);
trangle.setABC(12,34,1) ;
// trangle调用方法设置三个边,要求将三个边修改为12,34,1。
area=trangle.getArea(); //
trangle调用方法返回面积并赋值给area
System.out.println("三角形的面积:"+area);
length=trangle.getLength();// trangle调用方法返回周长并赋值给length
System.out.println("三角形的周长:"+length);
}
}
²
实验后的练习:
1. 程序中仅仅省略【代码15】,编译能通过吗?
2. 程序中仅仅省略【代码16】,编译能通过吗?
3. 程序中仅仅省略【代码15】,运行时出现怎样的异常提示?
1.
给Trangle类增加3个方法,分别用来返回3个边:sideA、sideB和sideC。
2.
让AreaAndLength类中的circle对象调用方法修改半径,然后输出修改后的半径以及修改半径后的圆的面积和周长。
2.实例成员与类成员。
²
实验要求:
按程序模板的要求编写源文件,要特别注意程序的输出结果,并能正确解释输出的结果。
²
程序运行效果示例:
程序运行效果如下图所示:
²
程序模板:
Example.java
class A
{
float
a;
//声明一个float型实例变量a
static float
b;
//声明一个float型类变量b,即static变量b
void
setA(float a)
{
this.a=a;
//将参数a的值赋值给成员变量a
}
void
setB(float b)
{
this.b=b;
//将参数b的值赋值给成员变量b
}
float
getA()
{
return a;
}
float
getB()
{
return b;
}
void
inputA()
{
System.out.println(a);
}
static
void inputB()
{
System.out.println(b);
}
}
public class Example
{
public
static void main(String args[])
{
A.b=100;
//通过类名操作类变量b,并赋值100
A.inputB();
//通过类名调用方法inputB()
A cat=new A();
A dog=new A();
cat.setA(200);
//cat象调用方法setA(int a)将cat的成员a的值设置为200
cat.setB(400);
//cat调用方法setB(int b)将cat的成员b的值设置为400
dog.setA(150);
//dog象调用方法setA(int
a)将dog的成员a的值设置为150
dog.setB(300);
//dog调用方法setB(int b)将dog的成员b的值设置为300
cat.inputA();
//cat调用inputA()。
cat.inputB();
//cat调用inputB()。
dog.inputA();
//dog调用inputA()。
dog.inputB():
//dog调用inputB()。
}
}
²
实验后的练习:
1. 将inputA()方法中的
System.out.println(a);
改写为
System.out.println(a+b);
编译是否出错?为什么?
2. 将inputB()方法中的
System.out.println(b);
改写为
System.out.println(a+b);
编译是否报错?为什么?
3.使用package语句与import语句。
²
实验要求:
按实验要求使用package语句,并用import语句使用Java平台提供的包中的类以及自定义包中的类。掌握一些重要的操作步骤。
²
程序运行效果示例:
程序运行效果如下图所示:
²
程序模板:
模板1:
将模板1给出的Java源文件命名为SquareEquation.java,将编译后得到的字节码文件复制到c:\1000\tom\jiafei目录中。
SquareEquation.java
package tom.jiafei;
public class SquareEquation
{
double
a,b,c;
double
root1,root2;
boolean
boo;
public SquareEquation(double a,double b,double
c)
{
this.a=a;
this.b=b;
this.c=c;
if(a!=0)
{
boo=true;
}
else
{
boo=false;
}
}
public
void getRoots()
{
if(boo)
{
System.out.println("是一元2次方程");
double disk=b*b-4*a*c;
if(disk>=0)
{
root1=(-b+Math.sqrt(disk))/(2*a);
root2=(-b-Math.sqrt(disk))/(2*a);
System.out.printf("方程的根:%f,%f\n",root1,root2);
}
else
{
System.out.printf("方程没有实根\n");
}
}
else
{
System.out.println("不是一元2次方程");
}
}
public void
setCoefficient(double a,double b,double c)
{
this.a=a;
this.b=b;
this.c=c;
if(a!=0)
{
boo=true;
}
else
{
boo=false;
}
}
}
模板2:
将模板2给出的Java源程序SunRise.java保存到d:\2000中。在编译模板2给出的Java源文件之前,要重新设置classpath。假设本地机SDK的安装目录是E:\jdk1.5。
在命令行执行如下命令:
set classpath=e:\jdk1.5\jre\lib\rt.jar;.;c:\1000
然后编译模板2给出的Java源程序。或用鼠标右键点击“我的电脑”,弹出快捷菜单,然后选择“属性”命令,弹出“系统属性”对话框,再单击该对话框中的“高级”选项卡,然后单击“环境变量”按钮。将classpath的值修改为:
E:\jdk1.5\jre\lib\rt.jar;.;c:\1000
然后重新打开一个命令行窗口,编译模板2给出的Java源程序。
SunRise.java
import tom.jiafei.*;
class SunRise
{
public
static void main(String args[ ])
{
SquareEquation equation=new SquareEquation(4,5,1);
equation.getRoots();
equation.setCoefficient(-3,4,5);
equation.getRoots();
}
}
²
实验后的练习:
假设SDK的安装目录是E:\jdk1.5,那么Java运行系统默认classpath的值是:E:\jdk1.5\jre\lib\rt.jar;.;
其中的“”表示应用程序可以使用当前目录中的无名包类以及当前目录下的子目录中的类,子目录中的类必须有包名,而且包名要和子目录结构相对应。
因此,如果将模板2应用程序Sunrise.java的字节码文件存放到d:\5000中,并将SquareEquation.java的字节码文件存放在D:\5000\tom\jiafei中,那么就不需要修改classpath。要特别注意的是,因为SquareEquation.java有包名,切不可将SquareEquation.java以及它的字节码文件存放在d:\5000中,即不可以和Sunrise.java的字节码存放在一起,请进行如下的练习:
1.
将SquareEquation.java存放在D:\5000\tom\jiafei中,编译:
D:\5000\tom\jiafei\javac
SquareEquation.java
2. 将Sunrise.java存放到D:\5000中,编译:
D:\5000\javac
Sunrise.java
3. 运行:
java Sunrise
1.用循环语句分别打印如图1-24所示的九九乘法表。
【参考程序】
//文件XiTi1_1_1_1.java
package XiTi;
import java.io.*;
import java.lang.*;
public class XiTi1_1_1{
public static void main(String args[]){
String
str=" ";
int
i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
str=i+"*"+j+"="+i*j;
if(i
System.out.print("
");
else
System.out.print(str.length()==5?str+" ":str+"
");
}
System.out.println("");
}
}
}
//文件XiTi1_1_2.java
package XiTi;
import java.io.*;
import java.lang.*;
public class XiTi1_1_2{
public static void main(String args[]){
String
str=" ";
int
i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
str=i+"*"+j+"="+i*j;
if(i>j)
System.out.print("
");
else
System.out.print(str.length()==5?str+" ":str+"
");
}
System.out.println("");
}
}
}
//文件XiTi1_1_3.java
package XiTi;
import java.io.*;
import java.lang.*;
public class XiTi1_1_3{
public static void main(String args[]){
String
str=" ";
int
i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
str=i+"*"+j+"="+i*j;
System.out.print(str.length()==5?str+" ":str+"
");
}
System.out.println("");
}
}
}
2.定义两个数组,首先将第一个数组中的元素复制到第二个数组中,然后将第二个数数组进行从大到小的排序,最后将两个数组中的对应元素进行比较,试统计两个数组中对应位置上相同元素的个数。
【参考程序】
//文件XiTi1_2.java
package XiTi;
import java.io.*;
import java.lang.*;
public class XiTi1_2{
public static void main(String[] args){
int a[]={278,109,063,930,589,184,505,269,8,83};
int b[]=new int[10];
int t,cnt=0;
for(int i=0;i<10;i++)
b[i]=a[i];
for(int
i=1;i<10;i++)
for(int
j=0;j<10-i;j++)
if(b[j]
t=b[j];b[j]=b[j+1];b[j+1]=t;
}
for(int
i=0;i<10;i++)
if(a[i]==b[i])
cnt++;
System.out.println("********************* a
**********************");
System.out.println("");
for(int
i=0;i<10;i++)
System.out.print(a[i]+" ");
System.out.println("");
System.out.println("");
System.out.println("********************* b
**********************");
System.out.println("");
for(int i=0;i<10;i++)
System.out.print(b[i]+" ");
System.out.println("");
System.out.println("");
System.out.println("对应元素相同的个数为:"+cnt);
System.out.println("");
}
}
实验五
字符串、时间与数字类
【目的】
①掌握String类的常用方法
②掌握Date类以及Calendar类的常用方法;
③掌握BigInteger类的常用方法。
【内容】
1.String类的常用方法。
²
实验要求:
编写一个Java应用程序,判断两个字符串是否相同,判断字符串的前缀、后缀是否和某个字符串相同,按字典顺序比较两个字符串的大小关系,检索字符串,创建字符串,将数字型字符串转换为数字,将字符串存放到数组中,用字符数组创建字符串。。
²
程序模板:
StringExample.java
class StringExample
{ public static void
main(String args[])
{ String s1=new String("you are
a student"),
s2=new String("how are you");
if(s1.equals(s2)) // 使用equals方法判断s1与s2是否相同
{
System.out.println("s1与s2相同");
}
else
{
System.out.println("s1与s2不相同");
}
String s3=new String("22030219851022024");
if(s3.startsWith("220302"))
//判断s3的前缀是否是“220302”。
{
System.out.println("吉林省的身份证");
}
String s4=new String("你"),
s5=new String("我");
if(s4.compareTo(s5)>0)//按着字典序s4大于s5的表达式。
{
System.out.println("按字典序s4大于s5");
}
else
{
System.out.println("按字典序s4小于s5");
}
int position=0;
String path="c:\\java\\jsp\\A.java";
position= path.lastIndexOf("\"); //获取path中最后出现目录分隔符号的位置
System.out.println("c:\\java\\jsp\\A.java中最后出现\\的位置:"+position);
String fileName=
path.substring(position+1);///获取path中“A.java”子字符串。
System.out.println("c:\\java\\jsp\\A.java中含有的文件名:"+fileName);
String s6=new String("100"),
s7=new String("123.678");
int n1= Integer.parseInt(s6);
//将s6转化成int型数据。
double n2= Double.parseDouble(s7);
//将s7转化成double型数据。
double m=n1+n2;
System.out.println(m);
String s8= String.valueOf(m);
//String调用valuOf(int n)方法将m转化为字符串对象
position=s8.indexOf(".");
String temp=s8.substring(position+1);
System.out.println("数字"+m+"有"+temp.length()+"位小数") ;
String s9=new String("ABCDEF");
char a[]=s8.toCharArray();
//将s8存放到数组a中。
for(int i=a.length-1;i>=0;i--)
{
System.out.print(" "+a[i]);
}
}
}
²
实验后的练习:
1. 程序中的s6改写成
String s6=new String(“1a12b”);
运行时提示怎样的错误?
2. 请用数组a的前3个单元创建一个字符串并输出该串。
3. 请给出获取path中“jsp”子字符串的代码。
4. 在程序的适当位置增加如下代码,注意输出的结果。
String str1=new String(“ABCABC”),
str2=null,
str3=null,
str4=null;
str2=str1.replaceAll(“A”,”First”);
str3=str2.replaceAll(“B”,”Second”);
str4=str3.replaceAll(“C”,”Third”);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str4);
5. 可以使用Long类中的下列static方法得到整数各种进制的字符串表示:
Public static
String toBinaryString(long i)
Public static
String toOctalString(long i)
Public static String toHexString(long i)
Public static String toString(long i,int p)
其中的toString(long i, int
p)返回整数i的p进制表示。请在适当位置添加代码输出12345的二进制、八进制和十六进制表示。
6. 在适当位置添加代码,分别输出数字m的整数部分和小数部分。
2.比较日期的大小。
²
实验要求:
编写一个Java应用程序,用户从输入对话框输入了两个日期,程序将判断两个日期的大小关系,以及两个日期之间的间隔天数。
²
程序模板:
DateExample
import java.util.*;
import javax.swing.JOptionPane;
public class DateExample
{
public static void
main(String args[ ])
{
String str=JOptionPane.showInputDialog("输入第一个日期的年份:");
int yearOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog("输入该年的月份:");
int monthOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog("输入该月份的日期:");
int dayOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog("输入第二个日期的年份:");
int yearTwo=Integer.parseInt(str);
str=JOptionPane.showInputDialog("输入该年的月份:");
int monthTwo=Integer.parseInt(str);
str=JOptionPane.showInputDialog("输入该月份的日期:");
int dayTwo=Integer.parseInt(str);
Calendar calendar=
Calendar.getInstance();
//初始化日历对象
calendar.set(yearOne,monthOne-1,dayOne);
//将calendar的时间设置为yearOne年monthOne月dayOne日
long timeOne= calendar.getTimeInMillis();
//calendar表示的时间转换成毫秒
calendar.set(yearTwo,monthTwo-1,dayTwo);
//将calendar的时间设置为yearTwo年monthTwo月dayTwo日
long timeTwo=calendar.getTimeInMillis();
//calendar表示的时间转换成毫秒。
Date date1= new Date(timeOne);
//
用timeOne做参数构造date1
Date date2= new Date(timeTwo);
//
用timeTwo做参数构造date2
if(date2.equals(date1))
{
System.out.println("两个日期的年、月、日完全相同");
}
else if(date2.after(date1))
{
System.out.println("您输入的第二个日期大于第一个日期");
}
else if(date2.before(date1))
{
System.out.println("您输入的第二个日期小于第一个日期");
}
long days=
(Math.abs(timeTwo - timeOne)) / (1000 * 60 * 60 * 24);
//计算两个日期相隔天数
System.out.println(yearOne+"年"+monthOne+"月"+dayOne+"日和"
+yearTwo+"年"+monthTwo+"月"+dayTwo+"相隔"+days+"天");
}
}
²
实验后的练习:
1.
Calendar对象可以将时间设置到年、月、日、时、分、秒。请改进上面的程序,使用户输入的两个日期包括时、分、秒。
2.
根据本程序中的一些知识,编写一个计算利息(按天计算)的程序。从输入对话框输入存款的数目和起止时间。
3.处理大整数。
²
实验要求:
编写一个Java应用程序,计算两个大整数的和、差、积和商,并计算一个大整数的因子个数(因子中不包括1和大整数本身)。
²
程序模板:
BigintegerExample
import java.math.*;
class BigIntegerExample
{
public static void
main(String args[])
{ BigInteger n1=new
BigInteger("987654321987654321987654321"),
n2=new BigInteger("123456789123456789123456789"),
result=null;
result= n1.add(n2);//n1和n2做加法运算
System.out.println("和:"+result.toString());
result= n1.subtract(n2); //n1和n2做减法运算
System.out.println("差:"+result.toString());
result= n1.multiply (n2);
//n1和n2做乘法运算
System.out.println("积:"+result.toString());
result= n1.divide(n2); //n1和n2做除法运算
System.out.println("商:"+result.toString());
BigInteger m=new BigInteger("1968957"),
COUNT=new BigInteger("0"),
ONE=new BigInteger("1"),
TWO=new BigInteger("2");
System.out.println(m.toString()+"的因子有:");
for(BigInteger i=TWO;i.compareTo(m)<0;i=i.add(ONE))
{
if((n1.remainder(i).compareTo(BigInteger.ZERO))==0)
{ COUNT=COUNT.add(ONE);
System.out.print("
"+i.toString());
}
}
System.out.println("");
System.out.println(m.toString()+"一共有"+COUNT.toString()+"个因子");
}
}
²
实验后的练习:
1. 编写程序,计算大整数的阶乘。
2. 编写程序,计算1+2+3…的前999999999项的和。
加载中,请稍候......