实验五 类和对象
实验目的
1. 掌握Java语言种类的定义、对象的创建、对象引用方法。
2. 初步了解面向对象设计方法
实验学时 6学时
实验内容
1.设计一个圆珠笔类BallPen,有1个属性boolean penPoint(笔尖是否伸出),有4个方法:
(1)构造方法BallPen (),将penPoint置为false
(2)按压操作方法void knock(),将penPoint置反
(3)获取笔尖状态方法 boollean getPenPoint()
(4)main方法
创建对象并对实例对象进行按压操作,显示笔尖的状态。
package code51;
public class BallPen { //将penPoint置为false
boolean penPoint;
BallPen() {
penPoint=false;
}
void knock() { //将penPoint置反
if(penPoint==false)
{
penPoint=true;
}
else
{
penPoint=false;
}
}
boolean getPenPoint() { //获取笔尖状态
return penPoint;
}
public static void main(String args[]) {
BallPen a = new BallPen(); //创建对象
a.knock(); //对实例对象进行按压操作
System.out.println("penPoint="+a.getPenPoint()); //显示笔尖的状态
}
}
2.设计一个汽车类Car,有2个属性车主owner和油量oil,有7个方法:
(1)构造方法Car(String owner,double oil)
(2)构造方法Car(String owner),油量置为0
(3)加油操作方法void addOil(double oil)
(4)行驶操作方法void drive(int distance)
假设每100公里的耗油量为定值(自己设置),根据行驶的公里数更新油量。
(5)获得车主信息方法String getOwner()
(6)获得油量方法double getOil()
(7)main方法
创建对象并对实例对象进行加油、行驶操作,显示车主、油量。
package code52;
public class Car {
String owner;
double oil;
double x;
int distance;
Car(String owner,double oil) {
this.owner=owner;
this.oil=oil;
}
Car(String owner) { //将油量置为0
oil=0;
}
void addOil(double oil) { //进行加油操作
oil+=x;
}
void drive(int distance) { //根据行驶的公里数更新油量
oil-=(distance/100*10);
}
String getOwner() { //获取车主信息
return owner;
}
double getOil() { //获取油量
return oil;
}
public static void main(String args[]) {
Car a = new Car("黄博文",100); //创建对象
a.addOil(100); //对实例对象进行加油操作
a.drive(200); //对实例对象进行行驶操作
System.out.println("owner="+a.getOwner()); //显示车主
System.out.println("oil="+a.getOil()); //显示油量
}
}
3.编写一个类表示坐标点,类中包含构造方法在新建类的时候对坐标赋值。另编写一个关于坐标点的工具类。
(1)编写坐标点类Point。
(2)编写工具类PointUtil,包含方法 double distance(Point a,Point b)用于求两个坐标点之间的距离,和方法double area(Point a,Point b)用于求两点连线为对角线的矩形面积。
(3)编写主方法求坐标(2,10)到坐标(4,55)之间的距离和矩形面积。
package code53;
public class PointUtil {
int x;
int y;
public PointUtil(int x,int y) {
this.x=x;
this.y=y;
}
double distance(PointUtil x1,PointUtil x2)
{
double distance=Math.sqrt((x1.x-x2.x)*(x1.x-x2.x)+(x1.y-x2.y)*(x1.y-x2.y));
return distance; //求两个坐标点之间的距离
}
double area(PointUtil x1,PointUtil x2)
{
double area=(x1.x-x2.x)*(x1.y-x2.y);
if(area<0)
{
area=-area;
}
return area; //求两点连线为对角线的矩形的面积
}
}
package code53;
import java.util.Scanner;
public class Point {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
System.out.println("请输入两个点的坐标:");
PointUtil x1 = new PointUtil(in.nextInt(),in.nextInt()); //创建对象并对点x1坐标赋值
PointUtil x2 = new PointUtil(in.nextInt(),in.nextInt()); //创建对象并对点x2坐标赋值
double distance=x1.distance(x1, x2); //调用方法求两点间距离
double area=x1.area(x1, x2); //调用方法求矩形面积
System.out.println("两坐标点间的距离为:"+distance);
System.out.println("围成矩形的面积为:"+area);
}
}
4. 编写Java程序模拟简单的计算器。 定义名为Number的类,其中有两个私有的整型数据成员x和y。有7个方法:
(1)构造方法Number(int x,int y)
(2)加法运算方法 int addition(int x,int y)
(3)减法运算方法 int subtration(int x,int y)
(4)乘法运算方法 int multiplication(int x,int y)
(5)除法运算方法 int division(int x,int y)
另外编写一个测试类,对Number类进行测试。
package code54;
public class Number {
int x,y;
Number(int x,int y) {
this.x = x;
this.y = y;
}
int addition(int x,int y) { //进行加法运算
return x+y;
}
int subtration(int x,int y) { //进行减法运算
return x-y;
}
int multiplication(int x,int y) { //进行乘法运算
return x*y;
}
int division(int x,int y) { //进行除法运算
return x/y;
}
}
package code54;
import java.util.Scanner;
public class TextNumber {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();
Number a = new Number(x,y); //创建对象
System.out.println("x+y="+a.addition(x, y)); //调用加法运算方法
System.out.println("x-y="+a.subtration(x, y)); //调用减法运算方法
System.out.println("x*y="+a.multiplication(x, y)); //调用乘法运算方法
System.out.println("x/y="+a.division(x, y)); //调用除法运算方法
}
}
5. 定义长方形类Rectangle,含:
(1)属性
int width;
int height;
(2)方法
Rectangle():宽、高默认值为1;
Rectangle(int val):宽、高均为参数值;
Rectangle(int width,int height):
Double getSquare():计算面积;
Double getPerimeter():计算周长;
另外编写测试类进行测试。
package code55;
public class Rectangle {
int width;
int height;
Rectangle() //宽、高默认值为1
{
width=1;
height=1;
}
Rectangle(int val) //宽、高均为参数值
{
width=val;
height=val;
}
Rectangle(int width,int height) {
this.width=width;
this.height=height;
}
Double getSquare() //计算面积
{
double square;
square=width*height;
return square;
}
Double getPerimeter() //计算周长
{
double c;
c=width*2+height*2;
return c;
}
}
package code55;
import java.util.Scanner;
public class TextRectangle {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入长方形的宽和高:");
int width=in.nextInt();
int height=in.nextInt();
Rectangle a=new Rectangle(width, height); //创建对象
System.out.println("面积为"+a.getSquare()+","+"周长为"+a.getPerimeter()); //调用方法求面积和周长
}
}
6. 定义一个时间类MyTime,有三个属性hour,minute,second。为MyTime类定义构造方法,以便创建对象时初始化成员变量。除了构造方法外,还要创建以下方法:
(1)nextSecond( ):时间经过1秒
(2)nextMinute( ):时间经过1分
(3)nextHour( ):时间经过1小时
(4)prevSecond( ):前1秒
(5)prevMinute( ):前1分
(6)prevHour( ):前一小时
(7)display( ):以HH:MM:SS格式显示时间
另外编写测试类,进行测试。
package code56;
public class MyTime {
int hour;
int minute;
int second;
public MyTime(int hour, int minute, int second) {
this.hour=hour;
this.minute=minute;
this.second=second;
}
void nextSecond() //时间经过一秒
{
if(second!=59) second+=1;
else
{
second=0;
if(minute!=59) minute+=1;
else
{
minute=0;
if(hour!=23) hour+=1;
else
{
hour=0;
}
}
}
}
void nextMinute() //时间经过一分
{
if(minute!=59) minute+=1;
else
{
minute=0;
if(hour!=23) hour+=1;
else
{
hour=0;
}
}
}
void nextHour() //时间经过一小时
{
if(hour!=23) hour+=1;
else
{
hour=0;
}
}
void prevSecond() { //前一秒
if(second!=0) second-=1;
else
{
second=59;
if(minute!=0) minute-=1;
else
{
minute=59;
if(hour!=0) hour-=1;
else
{
hour=23;
}
}
}
}
void prevMinute() { //前一分
if(minute!=0) minute-=1;
else
{
minute=59;
if(hour!=0) hour-=1;
else
{
hour=23;
}
}
}
void prevHour() //前一小时
{
if(hour!=0) hour-=1;
else
{
hour=23;
}
}
void display() //按HH:MM:SS的格式显示时间
{
System.out.println(hour+":"+minute+":"+second);
}
}
package code56;
import java.util.Scanner;
public class TextMyTime {
public static void main(String[] args) {
int hour=0,minute=0,second=0;
MyTime a=new MyTime(hour,minute,second); //创建对象并赋值
Scanner in = new Scanner(System.in);
a.hour=in.nextInt();
a.minute=in.nextInt();
a.second=in.nextInt();
a.prevHour();
a.nextMinute();
a.nextSecond(); //调用方法进行测试
a.display(); //按规定格式显示时间
}
}
7. 编写程序使用复数类Complex验证两个复数 2+2i 和3+3i 相加产生一个新的复数5+5i 。复数类Complex满足如下要求:
(1)属性
int realPart :复数的实部;
int imaginPart:复数的虚部;
(2)方法
Complex( ) : 构造方法,将复数的实部和虚部都置0;
Complex( int r , int i ) :
Complex complexAdd(Complex a) : 将当前复数对象与形参复数对象相加,所得的结 果仍是一个复数值,返回给此方法的调用者。
String toString( ) : 把当前复数对象的实部、虚部组合成 a+bi 的字符串形式,其中 a 和 b分别为实部和虚部的数据。
另外编写一个测试类Test,对Complex类进行测试。
package code57;
public class Complex {
int realPart;
int imaginPart;
Complex() {
realPart=0;
imaginPart=0; //将复数的实部和虚部都置为0
}
Complex(int r,int i) {
realPart=r;
imaginPart=i;
}
Complex complexAdd(Complex a)
{
realPart+=a.realPart;
imaginPart+=a.realPart; //将当前复数对象与形参复数对象相加
return a;
}
public String toString() //把当前复数对象的实部和虚部组合成a+bi的字符串形式
{
return realPart+"+"+imaginPart+"i";
}
}
package code57;
public class TestComplex {
public static void main(String args[]) {
Complex a=new Complex(1,1);
Complex b=new Complex(2,2); //创建对象并赋值
a.complexAdd(b); //调用方法将a、b的两部相加
System.out.println(a.toString()); //输出其组合形式
}
}
实验小结
- 类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
- 对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象;
- 在Java中定义类,使用关键字class完成;
- 对象.属性:表示调用类之中的属性;
- 对象.方法():表示调用类之中的方法;
- 如果一个类中已经明确定义了一个构造方法,则无参构造方法将不会自动生成;
- this关键字可以用来调用本类属性、方法、对象。