资源描述
学院 应用数学学院
专业
学号
姓名
教师评定
实验题目 继承与接口
一、 实验目的与要求
二、 实验方案
三、 实验结果和数据处理
四、 结论
五、 问题与讨论
一、 实验目的与要求
实验目的:
1、掌握类的继承关系。
2、掌握接口的定义与使用。
实验要求:
按下列要求编写Java程序:
1、定义接口Printx,其中包括一个方法printMyWay(),这个方法没有形参,返回值为空。
2、编写矩形类,矩形类要求实现Printx接口,有求面积、求周长的方法,printMyWay()方法要能显示矩形的边长、面积和周长。
3、编写正方形类作为矩形类的子类,正方形类继承了矩形类求面积和周长的方法,新增加求对角线长的方法,重写printMyWay()方法,要求该方法能显示正方形的边长、面积、周长和对角线长。
二、 实验方案
1、Java中可以采用接口处理互不相关的一些类,但这些类又具有相似的方法。接口是一系列常量和空方法的集合,它提供了多个类共有的方法,但不限制每个类如何实现这个方法。由于Java只支持单继承,不允许一个子类继承多个父类,但可以实现多个接口实现多继承的功能。
其定义格式如下:
interface 接口名称 //定义接口
{
final 数据类型 成员名称 = 常量; //数据成员必须赋初值
abstract 返回值的数据类型 方法名 (形参表);
//抽象方法,在方法体里没有定义方法主体
}
接口的实现语法
Class 类名称 implements 接口A,接口B
{
}
2、类是具有相同属性及相同行为的一组对象,在面向程序设计中,它是一个独立的单位,它有一个类名,其内部包括成员变量,用于描述对象的属性;还包括类的成员方法,用于描述对象的行为。类是一个抽象的概念,要利用类的方式来解决问题,必须用类创建一个实例化的对象,然后通过类对象去访问累的成员变量,去调用类的成员方法实现程序的功能。一个类可以创建多个类对象,它们具有相同的属性模式,但可以具有不同的属性值。Java程序为每一分类对象开辟内存空间,以便保存各自的属性值。在使用之前必须先声明,然后利用声明的类来声明变量,并创建对象。
类的定义语法:
Class 类名称
{
数据类型 属性; //类的成员变量
返回值的数据类型 方法名称 (参数表) //类的方法
{
程序语句;
return 表达式;
}
}
创建属于类的对象
类名 对象名 = new 类名( );
对象的使用
访问属性:对象名.属性名;
访问方法:对象名.方法名( );
3、构造函数与类具有相同的类名称,但没有返回值,构造函数是在创建对象时自动调用,并执行构造方法的内容。
构造方法的定义
Class 类名称
{
访问权限 类名称 (形参表)
{
程序语句;
}
}
4、通过类的继承可以简化类的定义,扩展类的功能,但是java只支持单继承。Java继承只能直接继承父类中的公有属性和公有方法。
实现继承的格式
class 子类名 extends 父类
super 关键字
5、super关键字出现在子类中,而且使其调用父类中的构造方法,super主要的功能是完成子类调用父类中的内容,也就是调用父类中的属性和方法。
具体实现代码
定义接口Printx,其中包括一个方法printMyWay(),这个方法没有形参,返回值为空。
interface printx
{
void printMyway();
}
编写矩形类,矩形类要求实现Printx接口,有求面积、求周长的方法,printMyWay()方法要能显示矩形的边长、面积和周长。
class Rectangle implements printx // 定义矩形类
{
double length; // 矩形长
double width; // 矩形宽
Rectangle(double x, double y) // 构造函数
{
length=x;
width=y;
}
public void printMyway() // 实现printMyway()方法
{
System.out.println("边长分别为: "+length+" 、 "+width+"的矩形");
System.out.println("面积为: "+length*width);
// 求矩形面积
System.out.println("周长为: "+2*(length+width));
// 求矩形周长
}
}
编写正方形类作为矩形类的子类,正方形类继承了矩形类求面积和周长的方法,新增加求对角线长的方法,重写printMyWay()方法,要求该方法能显示正方形的边长、面积、周长和对角线长。
class Square extends Rectangle // 定义正方形类并且继承矩形类
{
Double d;
Square(double x, double y) // 构造函数
{
super (x,y); // 调用父类构造函数
}
public void diagonal( ) // 计算正方形对角线长度方法
{
d=Math.sqrt(length*length+width*width);
System.out.println("对角线长为"+d);
}
}
主函数 TestClass
public class TestClass
{
public static void main (String args[])
{
Rectangle c1=new Rectangle(6,8);
System.out.println (c1.getClass().getName()+" 矩形") ;
// 获得当前类名
c1.printMyway();
Square c2=new Square(5,5);
System.out.println (c2.getClass().getName()+" 正方形") ;
// 获得当前类名
c2.printMyway();
c2.diagonal();
}
}
完整程序
interface printx
{
void printMyway();
}
class Rectangle implements printx
{
double length;
double width;
Rectangle(double x, double y)
{
length=x;
width=y;
}
public void printMyway()
{
System.out.println("边长分别为: "+length+" 、 "+width+"的矩形");
System.out.println("面积为: "+length*width);
System.out.println("周长为: "+2*(length+width));
}
}
class Square extends Rectangle
{
double d;
Square(double x, double y)
{
super (x,y);
}
public void diagonal( )
{
d=Math.sqrt(length*length+width*width);
System.out.println("对角线长为"+d);
}
}
public class TestClass
{
public static void main (String args[])
{
Rectangle c1=new Rectangle(6,8);
System.out.println (c1.getClass().getName()+" 矩形") ;
c1.printMyway();
Square c2=new Square(5,5);
System.out.println (c2.getClass().getName()+" 正方形") ;
c2.printMyway();
c2.diagonal();
}
}
三、 实验结果和数据处理
四、 结论
1、接口与一般类一样,本身也具有数据成员与方法,但数据成员一定要赋初值,并且之不能再更改,方法也必须是抽象方法,而没有一般的方法,其中abstract是可以省略的。接口中的抽象方法只做声明,而不定义处理方式。
2、类是有一个类名,其内部包括成员变量,用于描述对象的属性;还包括类的成员方法,用于描述对象的行为。类是一个抽象的概念,要利用类的方式来解决问题,必须用类创建一个实例化的对象,然后通过类对象去访问累的成员变量,去调用类的成员方法实现程序的功能。一个类可以创建多个类对象,它们具有相同的属性模式,但可以具有不同的属性值。Java程序为每一分类对象开辟内存空间,以便保存各自的属性值。在使用之前必须先声明,然后利用声明的类来声明变量,并创建对象。
3、继承是将相关类组成层次结构,允许新类从已存在的类中派生,通过保留他们的属性和方法,并可以在子类中根据自己的需要添加新的属性和方法。
五、 问题与讨论
1、子类不继承父类构造函数,子类怎样调用父类的构造函数,即创建一个子类的对象时,首先执行父类构造函数,然后执行子类构造函数。
答:super关键字出现在子类中,而且是去调用父类中的构造方法,所以可以得出结论:super关键字的主要的功能是完成子类调用父类中的内容,也就是调用父类中的属性和方法,但是在调用父类的构造函数是,super必须出在子类构造函数的第一行。
super关键字不仅可以调用父类中的构造函数,也可以调用父类中的属性和方法,格式如下:
super调用父类中的属性和方法格式
super.父类中的属性;
super.父类中的方法();
输出结果;
2、接口与类一样,那么接口可以和类一样允许接口与接口之间的继承吗?
答:同样,接口的扩展也可以通过关键字extends来实现,并且接口不像类一样只允许单继承,接口可以实现多继承。
接口继承语法:
interface 子接口名称 extends 父接口1,父接口2,……
{
final 数据类型 成员名称 = 常量; //数据成员必须赋初值
abstract 返回值的数据类型 方法名 (形参表);
//抽象方法,在方法体里没有定义方法主体
}
展开阅读全文