1、实验3 类对象和包实验三 类、对象和包实验目的通过编程和上机实验理解Java语言是如何体现面向对象编程基本思想,了解类的封装方法,以及如何创建类和对象,了解成员变量和成员方法的特性,了解包的定义和引用,掌握面向对象程序设计的方法。实验要求1、 编写一个体现面向对象思想的程序;2、 编写一个创建对象和使用对象的方法的程序;3、 编写一个显示当前日期和时间的程序;4、 编写不同成员变量修饰方法的程序;5、 编写不同成员方法修饰方法的程序;6、 编写多个类,在同一包,或不同包,验证包的定义和导入;验证对于public、private、protected及缺省修饰的成员的访问权限; 7、 编程验证st
2、atic成员的性质。实验内容1、 设计类来描述真实客观世界中的事物,使用类的成员变量来表示事物的属性和状态,使用类的成员方法来提供对成员变量的访问或修改(1) 程序功能:设计一个用来描述汽车的类,使用类的非静态成员变量来表示汽车的车主姓名、当前的速率和当前方向盘的转向角度,使用类的非静态成员方法来表示改变汽车的速率和停车两个操作。(2) 程序源代码如下。public class EXP3_1 private String ownerName; /车主姓名 private float curSpeed; /当前车速 private float curDirInDegree; /当前方向盘转向角度
3、 public EXP3_1(String ownerName) this.ownerName=ownerName; public EXP3_1(String ownerName, float speed, float dirInDegree) this(ownerName); this.curSpeed=speed; this.curDirInDegree=dirInDegree; public String getOwnerName() /提供对车主姓名的访问 return ownerName; public float getCurDirInDegree() /提供对当前方向盘转向角度的
4、访问 return curDirInDegree; public float getCurSpeed() /提供对当前车速的访问 return curSpeed; public void changeSpeed(float curSpeed) /提供改变当前的车速 this.curSpeed = curSpeed; public void stop() /提供停车 this.curSpeed=0; (3) 编译源程序。2、 创建类的对象实例,使用实例方法(非静态)来访问或修改实例变量(1) 创建类EXP3_1的对象,在调用类的构造函数时指定对象的变量的初始值,以后再使用对象的方法来访问或修改对
5、象的变量的值。(2) 程序代码如下。public class EXP3_2 public static void main(String args) EXP3_1 car=new EXP3_1(成龙,200f,25f); System.out.println(车主姓名: +car.getOwnerName(); System.out.println(当前车速: +car.getCurSpeed(); System.out.println(当前转向角度: +car.getCurDirInDegree(); car.changeSpeed(80); System.out.println(在调用ch
6、angeSpeed(80)后,车速变为: + car.getCurSpeed(); car.stop(); System.out.println(在调用stop()后, 车速变为: +car.getCurSpeed(); (3) 编译并运行,结果如图3.1所示。图 3.13、 编写显示当前时间和日期的程序(3) 程序功能:该程序通过使用一个自定义类Time,实现显示当前日期和时间的功能。(4) 程序代码如下。import java.util.Calendar;class Time private Calendar t; private int y, m, d, hh, mm, ss; Time
7、 () t=Calendar.getInstance(); y=t.get(t.YEAR); m=t.get(t.MONTH)+1; d=t.get(t.DATE); hh=t.get(t.HOUR_OF_DAY); mm=t.get(t.MINUTE); ss=t.get(t.SECOND); public String getDate() return y+ 年+m+月+d+日; public String getTime() return hh+ 时+mm+分+ss+秒; public class EXP3_3 public static void main(String args) T
8、ime t=new Time(); System.out.println(当前日期:+t.getDate(); System.out.println(当前时间:+t.getTime(); (5) 编译并运行,结果如图3.2所示。图 3.24、 使用修饰符来限定类的成员变量或成员方法的属性有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这时可以使用修饰符来实现这个目的。常用的修饰符如下:public private protected package static final transient volatile不同修饰符的访问控制权限如表3.1 所示。访问权限修饰符类子类包所有
9、类和包publicprotectedpackageprivate表 3.1(1) 程序功能:通过两个类StaticDemo、EXP3_4 说明静态变量/方法与实例变量/方法的区别。(2) 程序源代码如下。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 EXP3_4 pu
10、blic 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=
11、+a.getY();System.out.println(静态变量b.x=+b.getX();System.out.println(实例变量b.y=+b.getY();(3) 对上面的源程序进行编译,会出现如图3.3所示的出错提示。图 3.3(4) 将源程序中的出错语句删除或使用解释符/隐藏起来,例如,/System.out.println(实例变量y=+StaticDemo.getY();(5) 重新编译并运行该程序,结果如图3.4所示。图 3.45、 调用方法时参数传递的练习在其它语言中,函数调用或过程调用时参数有传值调用和传地址调用之分。在Java 中,方法中的参数传递可以分为传值调用或
12、对象方法调用等方式。传值调用即传递的参数是基本数据类型,调用方法时在方法中将不能改变参数的值,这意味着只能使用它们。对象调用是指先调用对象,再调用对象的方法,这种方式可以修改允许存取的成员变量。所以,如果不想改变参数的值,可以采用传值调用的方法。如果想改变参数的值,可采用对象调用的方法,间接修改参数的值。5.1、编写一个传值调用的程序(1) 程序功能:程序首先给整型变量x 和y 赋一个初值10,然后使用传值调用方式调用方法ff1对x 和y 做乘方及输出x 和y 的乘方值,最后再输出x 和y 的乘方值。(2) 程序源代码如下。class EXP3_5 public static void mai
13、n(String args) int x=10, y=10;ff1(x, y);System.out.println(x=+x+, y=+y);static void ff1(int passX, int passY) passX=passX*passX;passY=passY*passY;System.out.println(passX=+passX+, passY=+passY);(3) 编译并运行,结果如图3.5。图 3.55.2、编写一个调用对象方法的程序(1) 程序功能:通过调用对象的方法在方法调用后修改了成员变量的值。(2) 程序源代码如下。class EXP3_6 public
14、static void main(String args) Power p=new Power();p.ff2(10,10);System.out.println(方法调用后 x=+p.x+, y=+p.y);class Powerint x=10, y=10;void ff2(int passX, int passY) System.out.println(初始时 x=+x+, y=+y);x=passX*passX;y=passY*passY;System.out.println(方法调用中 x=+x+, y=+y);(3) 编译并运行,结果如图3.6。图 3.66、 编写多个类,在同一包
15、,或不同包,验证包的定义和引用;验证对于public、private、protected及缺省修饰的成员的访问权限(自行编程)7、构造方法的重载class Circle private double r; public double getArea() return Math.PI*r*r; Circle() this(1);/调用Circle(double x)方法来初始化 Circle(double x) r = x; class TestCircle public static void main(String s) Circle c1 = new Circle(); Circle c2
16、 = new Circle(2); System.out.println(c1.getArea(); System.out.println(c2.getArea(); 8、父类的无参构造方法,对子类很重要。修改下面的程序,为父类添加无参的构造方法。import java.awt.Color;class Graph/图形,父类 Graph(Color c)class Circle extends Graph private double r; public double getArea() return Math.PI*r*r; Circle() this(1);/调用Circle(double
17、 x)方法来初始化 Circle(double x)/*这里编译器报错:这个构造方法,既没有调用本类的其它构造方法,也没有显式调用父类的构造方法,编译系统将自动为它补充super();作为第一条语句。即,调用父类的无参构造方法。但父类Graph中没有无参的Graph()构造方法*/ r = x; class TestCircle public static void main(String s) Circle c1 = new Circle(); Circle c2 = new Circle(2); System.out.println(c1.getArea(); System.out.pri
18、ntln(c2.getArea(); 结论:在声明构造方法时,好的声明习惯是: 不声明任何构造方法 如果声明,至少声明一个无参构造方法9、static修饰符。用它修饰的变量是静态变量(类变量),用它修饰的方法称为静态方法(类方法)。实例变量、实例方法是非静态的,依赖于具体对象实例。比如,圆Circle有c1和c2这两个对象,但两个圆的半径是不同的变量。静态变量(比如,圆对象的数量count)和静态方法属于类,供多个对象共享。class Circle private double r;/每个圆的半径不同,故r应该非静态,属于具体对象实例。 static int count = 0;/count属
19、于类,静态 public double getArea() return Math.PI*r*r; Circle() this(1);/调用Circle(double x)方法来初始化 Circle(double x) r = x; count+;/每构造一个对象,count会增1 class TestCircle public static void main(String s) Circle c1 = new Circle(); Circle c2 = new Circle(2); System.out.println(c1.getArea(); System.out.println(c2
20、.getArea(); System.out.println(现在共建立了+Circle.count+个Circle对象); 10、关于静态块static 的用法。提示:(1)加载类时执行,常用来对多个静态变量进行显式初始化(此时还没有对象)。(2)只执行一次,即便多次加载,也只有在第一次加载时执行。关于非静态块的用法。提示:(1)构造方法执行前先执行(2)常用来对实例变量初始化class Circle double r; static int count; static/*静态块。在该类被加载时执行。常用来对静态变量初始化。此时还没有对象。*/ System.out.println(这里是显
21、式地对静态变量初始化); count = 0; /*非静态块。每当要构造对象,该代码块会抢先在构造方法前执行。常对实例变量初始化。如果不构造对象,则该代码块不会执行。*/ System.out.println(要构造了,这里可以初始化实例变量); r = 5; Circle() System.out.println(构造方法运行); r = 1;/这里把r从5改成1 count+;/每新建一个圆对象,count增1 public class TestCircle public static void main(String s) System.out.println(main函数开始执行了);
22、 System.out.println(构造前,圆对象的数量是+Circle.count); Circle c = new Circle(); System.out.println(构造后,圆对象的数量是+Circle.count); System.out.println(c.r); new Circle(); tryClass.forName(Circle);/再把类Circle加载一次,静态块不执行。 catch(Exception e) 11、编程练习题目定义类Circle。其属性有半径radius,圆心位置center。下面分别是Circle.java和TestCircle.java的
23、部分代码。请将其完善。下面是Circle.java部分代码import java.awt.Point;class Circle private double radius; private Point center; Circle() this(1.0); Circle(double r) radius = r; center = new Point(); Circle(int x, int y)/需要你完善 Circle(Point p) /需要你完善 Circle(int x, int y, double r) /需要你完善 Circle(Point p, double r) /需要你完善
24、 public double getRadius() return radius; public void setRadius(double r) radius = r; public Point getCenter() return center; public void move(int x, int y) center.move(x, y); 下面是TestCircle.java部分代码import javax.swing.JFrame;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.
25、awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class TestCircle extends JFrame Circle circle = new Circle(100,100,10); public static void main(String args) new TestCircle().lauch(); public void lauch() setLocation(200, 200); setSize(200,200); addWindowListener(new WindowAdapter() p
26、ublic void windowClosing(WindowEvent e) System.exit(0); ); setVisible(true); addKeyListener(new KeyMonitor(); class KeyMonitor extends KeyAdapter public void keyPressed(KeyEvent e) int key = e.getKeyCode(); switch(key) case KeyEvent.VK_UP:/下面需要你补充 System.out.println(向上移动后,输出circle位置); break; case Ke
27、yEvent.VK_DOWN:/下面需要你补充 System.out.println(向下移动后,输出circle位置); break; case KeyEvent.VK_LEFT:/下面需要你补充 System.out.println(向左移动后,输出circle位置); break; case KeyEvent.VK_RIGHT:/下面需要你补充 System.out.println(向右移动后,输出circle位置); break; case KeyEvent.VK_PAGE_UP:/radius加1 circle.setRadius(circle.getRadius()+1); System.out.println(radius= + circle.getRadius(); break; case KeyEvent.VK_PAGE_DOWN:/radius减1 if(circle.getRadius()1) circle.setRadius(circle.getRadius()-1); System.out.println(radius= + circle.getRadius(); break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1