实验二 类与对象(一)

南昌航空大学实验报告

2020   年  4  月 30   日

课程名称:面向对象程序设计A            实验名称:        Java程序控制结构               

学号:  19201407  姓名:陈世林 同组人:                                               

指导教师评定:                                      签名:                                    

一、实验目的

1、  掌握类与对象的基本概念;

2、  掌握类的声明、创建与使用方法;

3、  掌握类的构造方法的定义与使用方法

4、  掌握类的成员变量、成员方法的定义与使用方法;

5、  理解类变量、类方法与实例变量、实例方法的区别;

6、  理解Java中方法重载的实现方式。

二、实验要求

1、  根据实验步骤中提出的要求,编写相应的Java程序;

2、  编译、运行自己所编写的Java程序;

3、  根据编译与运行过程中所获得的错误信息修改程序直至获得正确的结果;

4、  记录实验中遇到的各类问题并以及解决办法。

三、实验步骤

1、  类的声明、创建与使用

Final static 是声明常量,常量一旦声明就不允许更改了。所以进行修改

运行CircleText 后发现得不到相应的答案,是因为没有给r赋值。一个变量作为类成员使用的知时候,如果没有被初始化,java会为其分配默认值

2、构造方法

(1)       Circle类没有声明构造方法,那么语句Circle c=new Circle();中调用的构造方法Circle()会不会出错?为什么?

     不会出错,类中没有声明构造方法,系统则会自动生成一个不带参数的构造方法

(2)  在Circle类中添加以下构造方法:

Circle(double radius){

              r= radius;

}

(3) 重新编译Circle.java之后,运行CircleTest将会出现什么错误?为什么?如何修改?

语句Circle c=new Circle();会出现错误,因为类Circle中有了带参数的构造方法,所以要在CircleTest中修改,修改如下

import java.util.Scanner;

public class CircleTest {

       public static void main(String args[]){

              Scanner in = new Scanner(System.in);

              Circle c=new Circle(in.nextDouble());

              System.out.printf("Area of the Circle is : %8.4f",c.area());

       }

}

class Circle{  

      static final double PI=3.14;

       double r;

       Circle(double radius){

              r = radius;

       }

       double circumference(){

              return 2*PI*r;             

       }

       double area(){

              return PI*r*r;

       }}

1、  类变量与类方法

(1)       在CircleTest类的main方法中添加以下代码:

Circle c1=null;

System.out.printf("PI is : %8.4f",c1.PI);      //或Circle.PI

(2)       修改后编译运行是否会出错?为什么?

     修改后没有出错

(3)       在Circle类中添加以下代码:

static void setPI(double pi){

           PI=pi;

           this.r=3;

}

(4)       重新编译Circle类会出现什么错误?为什么?如何修改?

this报错,在这里不能用this,在Circle类中用r不需要加this,在主方法中改变变量的值,变量需要是静态类型,修改方法:把this删去,然后把r和PI的类型改成static静态类型,去掉private

(5)       修改CircleTest类的main方法为:

 

Circle c1=null;

              System.out.printf("PI is : %8.4f\n",c1.PI); 

              Circle c=new Circle(3);

              System.out.printf("Area of the Circle is : %8.4f\n",c.area());

              c1.setPI(3.1415926);

System.out.printf("PI is : %8.4f\n",c1.PI); 

System.out.printf("Area of the Circle is : %8.4f\n",c.area());

(6)       上述代码将输出什么结果?通过阐述其执行过程说明出现该输出结果的原因。

结果:PI is :   3.1400
Area of the Circle is :  28.2600
PI is :   3.1416
Area of the Circle is :  28.2743

程序首先创建一个Circle类型的对象c1,然后打印对象的PI值,是3.1400

而后又创建一个Circle类型的对象c,对r赋值为3,然后打印Circle的面积,调用c.area()方法,值为28.2600

然后调用c1对象的setPI方法,对PI进行修改,将PI的值从3.14改为3.1415926,这个时候Circle 类中的PI变成了3.1415926,只要是Circle类的对象,其PI值都为3.1415926

然后打印c1对象的PI值,再打印c对象的面积,这个时候变成了28.2743

4、  方法重载

(1)       编写下面所给的Java程序并将文件名改为Circle.java;

class SomeThing{

    int x;

    int y;

   

    void move(int x,int y){

           this.x=x;

           this.y=y;

    }    

   

}

(2)       在SomeThingl类中尝试分别添加以下代码,以验证哪些形式的重载有效,并说明其原因

boolean move(int x,int y){

           boolean flag=(this.x==x)&&(this.y==y);

           this.x=x;

           this.y=y;

           return flag;

    }

 

    void move(int width,int height){

           x+=width;

           y+=height;

    }

 

    void move(int distance,boolean direction){

           if (direction)

                  x+=distance;

           else

                  y+=distance;

    }

这三个方法中,只有最后一个方法可以实现重载,重载实现的几个条件,是两同三不同,所谓两同,

就是指方法重载需要满足的条件

同一个类中

方法名称相同

三不同:也是指方法重载的条件, 参数列表不同(具体表述为:参数列表的参数的类型,个数,顺序不同)

猜你喜欢

转载自www.cnblogs.com/shaulchen/p/12817710.html