浙江理工大学java实验2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二面向对象编程练习
【开发语言及实现平台或实验环境】
Windows2000 或XP,JDK1.6或1.7与Eclipse
【实验目的】
1.理解Java语言是如何体现面向对象编程基本思想,
2.了解类的封装方法,以及如何创建类和对象,
3.了解成员变量和成员方法的特性。
4.掌握OOP方式进行程序设计的方法,
5.了解类的继承性和多态性的作用。
6.掌握包、接口的设计方法。
【实验内容】
一.类与对象的创建与使用练习
1.编写Applet 程序
(1)程序功能:这个Applet 程序要在页面上输出两个矩形,并伴有文字输出。
(2)定义一个MyBox类,包含有x, y, width, height四个成员变量以及MyBox(),
MyBox(int xPos, int yPos, int w, int h), void setPosition (int xPos, int yPos) ,void setSize (int w, int h), int getX() ,int getY(),void draw(Graphics g) 成员方法.
(3)Demo2_1.java 程序的主类源代码如下。
import java.awt.*;
import java.applet.Applet;
public class Demo2_1 extends Applet {
MyBox b1=new MyBox();//创建对象b1
MyBox b2=new MyBox(170,20,60,60); //创建对象b2
public void paint(Graphics g) {
b1.setPosition(20,20);
b1.setSize(60,60);
b1.draw(g);
g.drawString("矩形 1 的 X 位置: "+b1.getX(), 20, 100);
g.drawString("矩形 1 的 Y 位置: "+b1.getY(), 20, 120);
b2.draw(g);
g.drawString("矩形 2 的 X 位置: "+b2.getX(), b2.getX(), b2.getY()+80);
g.drawString("矩形 2 的 Y 位置: "+b2.getY(), b2.getX(), b2.getY()+100);
}
}
2.编写一个浏览Applet 应用程序的页面文件Demo2_1.HTML
3.将Demo2_1.java 源程序编译为Demo2_1.class 文件
4.使用浏览器或使用小程序查看器浏览Demo2_1.HTML 文件(即在命令提示符下输入:appletviewer Demo2_1.HTML),运行结果如图所示。
代码:
Demo2_1.java
import java.awt.*;
import java.applet.Applet;
public class Demo2_1 extends Applet{
/**
*
*/
private static final long serialVersionUID = 1L;
MyBox b1= new MyBox();
MyBox b2= new MyBox(170,20,60,60);
public void paint(Graphics g){
b1.setPosition(20,20);
b1.setSize(60,60);
b1.draw(g);
g.drawString("矩形1的X位置:"+b1.getX(),20,100);
g.drawString("矩形1的Y位置:"+b1.getY(),20,120);
b2.draw(g);
g.drawString("矩形2的X位置:"+ b2.getX(),b2.getX(),b2.getY() +80);
g.drawString("矩形2的Y位置:"+ b2.getY(),b2.getX(),b2.getY() +100); }
}
MyBox.java
import java.awt.Graphics;
class MyBox{
private int x,y,width,height;
MyBox(){x=0;y=0;width=0;height=0;}
MyBox(int xPos,int yPos,int w,int h){
x=xPos;y=yPos;width=w;height=h;
}
public void setPosition(int xPos,int yPos){x=xPos;y=yPos;}
public void setSize(int w,int h){width=w;height=h;}
public int getX(){return x;}
public int getY(){return y;}
public void draw(Graphics g){g.drawRect(x,y,width,height);}
}
实验结果:
二.修饰符的使用
有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这时可以使用修饰符来实现这个目的。
常用的修饰符如下。
[public] [private] [protected] [package] [static] [final] [transient] [volatile]不同修饰符的访问控制权限如表所示。
1.程序功能:通过两个类StaticDemo、Demo2_2 说明静态变量/方法与实例变量/方法的区别。
2.编写类文件Demo2_2.java,程序源代码如下。
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 Demo2_2 {
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.对上面的源程序进行编译,是否会有错误?如果有,错误原因是什么?将源程序中的出错语句删除或使用解释符//隐藏起来,分析运行结果,可以得出几点结论?
错误:Exception in thread "main" ng.Error: Unresolved compilation problems:
StaticDemo cannot be resolved
StaticDemo cannot be resolved
StaticDemo cannot be resolved to a type
StaticDemo cannot be resolved to a type
StaticDemo cannot be resolved to a type
StaticDemo cannot be resolved to a type
at Demo2_2.main(StaticDemo.java:4)
改正后:
public class Demo2_2 {
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();
StaticDemo.setX(1);
a.setY(2);
StaticDemo.setX(3);
b.setY(4);
System.out.println("静态变量a.x="+StaticDemo.getX());
System.out.println("实例变量a.y="+StaticDemo.getY());
System.out.println("静态变量b.x="+StaticDemo.getX());
System.out.println("实例变量b.y="+StaticDemo.getY());
}
}
class StaticDemo {
static int x;
static int y;
public static int getX() {
return x;
}
public static void setX(int newX) {
x = newX;
}
public static int getY() {
return y;
}
public void setY(int newY) {
y = newY;
}
}
三.方法中参数传递的练习
在其它语言中,函数调用或过程调用时参数有传值调用和传地址调用之分。
在Java 中,方法中的参数传递可以分为传值调用或对象方法调用等方式。
传值调用即传递的参数是基本数据类型,调用方法时在方法中将不能改变参数的值,这意味着只能使用它们。
对象调用是指先调用对象,再调用对象的方法,这种方式可以修改允许存取的成员变量。
所以,如果不想改变参数的值,可以采用传值调用的方法。
如果想改变参数的值,可采用对象调用的方法,间接修改参数的值。
1.编写一个传值调用的程序文件Demo2_3.java。
(1)程序功能:程序首先给整型变量x 和y 赋一个初值10,然后使用传值调用方式调用方法ff1对x 和y 做乘方及输出x 和y 的乘方值,最后再输出x 和y 的乘方值。
(2)程序源代码如下。
class Demo2_3 {
public static void main(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)编译Demo2_3.java,分析运行结果。
未改变x,y的值,,输出x,y的平方
2.编写一个调用对象方法的程序文件Demo2_4.java。
(1)程序功能:通过调用对象的方法在方法调用后修改成员变量的值。
(2)Demo2_3.java 程序源代码如下。
class Demo2_3{
public static void main(String[] args) {
Power p=new Power();
p.ff2(10,10);
System.out.println("方法调用后 x="+p.x+", y="+p.y);
}
}
class Power{
int 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)编译Demo2_3.java,分析运行结果。
改变了x,y本身,输出x,y的平方
四.综合练习
编写求解几何图形(如三角形,矩型,圆)的周长、面积的应用程序。
其中定义一个interface getProperty
{
double Pi=3.1415926;
double getArea();
double getCircum();
String getName();
}
class triangle,class circle,class rectangle实现该接口中的方法。
要求程序能从键盘上接受数据以便求解不同的几何图形的周长面积。
提示:从键盘上输入双精度数的一种方法(程序片段)
……
public static void main(String args[]) throws IOException
{
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
String x;
x=keyin.readLine();
double a=Double.parseDouble(x);
……
输入的另一种方法:用Scanner类的方法
Scanner scan = new Scanner(System.in);
year = scan.nextInt();等等
代码:
package yf;
public interface get{
double getArea();
double getCircum();
String getName();
}
class triangle implements get{
double a,b,c;
public triangle(double a, double b, double c){ this.a = a; this.b = b; this.c = c;
}
@Override public double getArea(){
double Area,p;
p=(a+b+c)/2;
Area=Math.sqrt(p*(p-a)*(p-b)*(p*c));
return Area;
}
@Override public double getCircum() { return this.a + this.b + this.c;
}
@Override public String getName(){
return "triangle";
}
}
class Circle implements get{
double r;
double Pi=3.1415926;
public Circle(double r){
this.r = r;
}
@Override public double getArea(){ double Area;
Area=r*r*Pi;
return Area;
}
@Override public double getCircum(){ double Circum;
Circum=2*Pi*r;
return Circum;
}
@Override public String getName(){
return "circle";
}
}
class rectangle implements get{
double a,b;
public rectangle(double a,double b){
this.a = a;
this.b = b;
}
@Override public double getArea(){
return a*b;
}
@Override public double getCircum(){
return 2*(a+b);
}
@Override public String getName(){
return "rectangle";
}
}
class Dynamic{
public static void main(String[] args){
get g = null;
if(args.length == 1)
g = new Circle(Double.parseDouble(args[0]));
else if(args.length == 2)
g = new rectangle(Double.parseDouble(args[0]),
Double.parseDouble(args[1]));
else if(args.length == 3)
g = new triangle(Double.parseDouble(args[0]),
Double.parseDouble(args[1]),
Double.parseDouble(args[2]));
else
System.out.println("error!");
System.out.println(g.getName());
System.out.println(g.getArea());
System.out.println(g.getCircum());
}
}。