实验五 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));
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容