您的当前位置:首页实验五 Java的类及多态性

实验五 Java的类及多态性

2022-12-29 来源:爱问旅游网


实验五 Java的类及多态性

一、实验目的:

1. 掌握Java类及多态性的含义。

2. 掌握instanceof的使用方法。

3. 掌握应用变量的转换。

二、实验要求:

编写一个能体现多态性的Java应用程序。

三、实验内容:

(1)类

1、常量的声明 :声明一个常量PI,编译它,查看有何错误并修改。

错误:

class Point

{ int x,y;

static int z;

final double PI=3.1415926; [修改:赋值3.1415926]

Point(int a,int b)

{ x=a;

y=b;

}

Point()

{ this(1,1);

}

static void output()

{ System.out.println(\"output() called\");

System.out.println(z);

}

void output(int a,int y)

{ output();

z=5;

this.x=x;

this.y=y;

}

public static void main(String [] args)

{ Point pt1=new Point();

Point pt2=new Point();

pt1.z=5;

pt2.z=6;

System.out.println(pt1.z);

}

}

2、声明一个静态的常量:修改上题的前半部分,如下。编译,查看有何错误,并修改

错误:

class Point

{ int x,y;

static int z;

final double PI ; [修改:删除static。]

Point(int a,int b)

{ PI=3.1415926;

x=a;

y=b;

}

Point()

{ this(1,1);

}

static void output()

{ System.out.println(\"output() called\");

System.out.println(z);

}

void output(int a,int y)

{ output();

z=5;

this.x=x;

this.y=y;

}

public static void main(String [] args)

{ Point pt1=new Point();

Point pt2=new Point();

pt1.z=5;

pt2.z=6;

System.out.println(pt1.z);

}

}

3、继承:新建一个Animal.java文件,并编译它。查看源文件的当前目录下生成了几个类文件,并选择一个执行它,输出结果。

class Animal

{ int height,weight;

void eat()

{ System.out.println(\"animal eat\");

}

void sleep()

{ System.out.println(\"animal sleep\");

}

void breathe()

{ System.out.println(\"animal breathe\");

}

}

class Fish extends Animal

{

}

class Integration

{

public static void main(String[] args)

{ Animal an=new Animal();

Fish fh=new Fish();

an.breathe();

fh.height=30;

fh.breathe();

}

}

4、修改上题中的class Fish extends Animal类,如下,并执行它,查看结果。

class Fish extends Animal

{ void breathe()

{ System.out.println(\"animal bubble\");

}

}

5、再次修改class Fish extends Animal类和Integration类,如下,并执行,查看结果。并思考课件中对于super的说明。

class Animal

{ int height,weight;

void eat()

{ System.out.println(\"animal eat\");

}

void sleep()

{ System.out.println(\"animal sleep\");

}

void breathe()

{ System.out.println(\"animal breathe\");

}

}

class Fish extends Animal

{ int height;

void breathe()

{ super.breathe();

super.height=40;

System.out.println(\"fish bubble\");

}

}

class Integration

{

public static void main(String[] args)

{ //Animal an=new Animal();

Fish fh=new Fish();

//an.breathe();

fh.height=30;

fh.breathe();

}

}

Super 用法:

 提供了对父类的访问。

 可以使用super访问父类被子类隐藏的变量或覆盖的方法。

6、分别在Animal类和Fish类中,添加构造方法如下:

并将Integration类,修改如下

class Animal

{ int height,weight;

void eat()

{ System.out.println(\"animal eat\");

}

void sleep()

{ System.out.println(\"animal sleep\");

}

void breathe()

{ System.out.println(\"animal breathe\");

}

Animal()

{ System.out.println(\"animal construct\");

}

}

class Fish extends Animal

{ int height;

void breathe()

{ super.breathe();

super.height=40;

System.out.println(\"fish bubble\");

}

Fish()

{System.out.println(\"fish construct\");

}

}

class Integration

{

public static void main(String[] args)

{ //Animal an=new Animal();

Fish fh=new Fish();

}

}

查看执行结果,并思考为什么

思考:当实类化对象时,会默认执行里边的构造方法。

7、执行下边程序,并修改错误

class Animal

{ int height,weight;

Animal(int height,int weight)

{ System.out.println(\"animal construct\");

}

void eat()

{ System.out.println(\"animal eat\");

}

void sleep()

{ System.out.println(\"animal sleep\");

}

void breathe()

{ System.out.println(\"animal breathe\");

}

}

class Fish extends Animal

{ int height;

Fish()

{ super();

System.out.println(\"fish construct\");

}

void breathe()

{ //super.breathe();

//super.height=40;

System.out.println(\"fish bubble\");

}

}

class Integration

{

public static void main(String[] args)

{ //Animal an=new Animal();

Fish fh=new Fish();

}

}

修改:给super赋值。

(2)多态性

1、注意成员变量和成员方法的调用,查看输出结果

class Animal

{ int height=1,weight=1;

Animal()

{

}

void eat()

{ System.out.println(\"animal eat\");

}

void sleep()

{ System.out.println(\"animal sleep\");

}

void breathe()

{ System.out.println(\"animal breathe\");

}

}

class Fish extends Animal

{ int height=10;

Fish()

{

}

void breathe()

{

System.out.println(\"fish breathe\");

}

void swim()

{

System.out.println(\"fish swim\");

}

}

class Integration

{

static void fn(Animal an)

{

an.breathe();

}

public static void main(String[] args)

{ Animal an=new Animal();

System.out.println(an.height);

an.eat();

an.breathe();

Fish fh=new Fish();

System.out.println(fh.height);

fh.breathe();

fh.swim();

Animal x=new Fish();

System.out.println(x.height);

x.eat();

x.breathe();

}

}

2、在main方法中,用x调用swim方法,添加代码如下:

x.swim();

编译后,发现有何错误?

修改:

引用变量只能调用声明该变量时所用类里包含的方法。

3、instanceof方法的使用

在上题main方法中添加如下代码,并写出结果

class Animal

{ int height=1,weight=1;

Animal()

{

}

void eat()

{ System.out.println(\"animal eat\");

}

void sleep()

{ System.out.println(\"animal sleep\");

}

void breathe()

{ System.out.println(\"animal breathe\");

}

}

class Fish extends Animal

{ int height=10;

Fish()

{

}

void breathe()

{

System.out.println(\"fish breathe\");

}

void swim()

{

System.out.println(\"fish swim\");

}

}

class Integration

{

static void fn(Animal an)

{

an.breathe();

}

public static void main(String[] args)

{ Animal an=new Animal();

System.out.println(an.height);

an.eat();

an.breathe();

Fish fh=new Fish();

System.out.println(fh.height);

fh.breathe();

fh.swim();

Animal x=new Fish();

System.out.println(x.height);

x.eat();

x.breathe();

Fish fh2=(Fish)x;

fh2.swim();

if(x instanceof Fish)

{ System.out.println(\"x is fish's instance\");

}

else

{ System.out.println(\"x isn't fish's instance\");

}

if(fh instanceof Animal)

{ System.out.println(\"fh is animal's instance\");

}

else

{ System.out.println(\"fh isn't animal's instance\");

}

}

}

4、引用变量之间的强制类型转换

阅读程序,并编译,查看有何错误

public class TestConversion

{

public static void main(String[] args)

{

double d = 13.4;

long l = (long)d;

System.out.println(l);

int in = 5;

//下面代码编译时出错:试图把一个数值型变量转换为boolean型,

//编译时候会提示: 不可转换的类型

//boolean b = (boolean)in;

Object obj = \"Hello\";

//obj变量的编译类型为Object,是String类型的父类,可以强制类型转换

//而且obj变量实际上类型也是String类型,所以运行时也可通过

String objStr = (String)obj;

System.out.println(objStr);

//定义一个objPri变量,编译类型为Object,实际类型为Integer

Object objPri = new Integer(5);

//objPri变量的编译类型为Object,是String类型的父类,可以强制类型转换

//而objPri变量实际上类型是Integer类型,所以下面代码运行时引发ClassCastException异常

String str = (String)objPri;

}

}

Integer不能强制转化成String,这里应该用到toString或者String.valueOf()。

5、复习递归的方法

已知有一个数列:f(20)=1,f(21)=4,f(n+2)=2*f(n+1)+f(n); 其中,n是大于零的整数,

求f(10)的值。

class RecursionDemo

{ public static int Demo(int n)

{ if(n==20)

{ return 1;

}

else if(n==21)

{ return 4;

}

else

{ return Demo(n+2)-2*Demo(n+1);

}

}

public static void main(String args[])

{ System.out.println(Demo(10));

}

}

已知有一个数列:f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n); 其中,n是大于零的整数,求f(10)的值。

class RecursionDemo

{ public static int Demo(int n)

{ if(n==0)

{ return 1;

}

else if(n==1)

{ return 4;

}

else

{ return 2*Demo(n-1)+Demo(n-2);

}

}

public static void main(String args[])

{ System.out.println(Demo(10));

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容