Java塑形接口实验1.docx
- 文档编号:17655840
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:15
- 大小:79.40KB
Java塑形接口实验1.docx
《Java塑形接口实验1.docx》由会员分享,可在线阅读,更多相关《Java塑形接口实验1.docx(15页珍藏版)》请在冰豆网上搜索。
Java塑形接口实验1
Java接口、塑型实验
(1)
一、实验目的与要求
1、掌握接口的概念,深刻理解接口的真正内涵
2、掌握Java中接口的使用方法
3、熟悉如何将接口的思想运用到实际编程中去
4、掌握塑型的概念、掌握塑性的应用
5、掌握塑型前后对象方法的查找顺序。
二、内容概要
1、接口相关知识
接口定义:
接口是抽象方法和常量值的定义的集合。
本质上讲,接口是一种特殊的抽象类,这种抽象类只包括常量和方法的定义,而没有变量和方法的实现。
接口定义举例:
Runner.java
publicinterfaceRunner{
publicstaticfinalintid=1;
publicvoidstart();
publicvoidrun();
publicvoidstop();
}
接口的特性:
a、接口可以多重实现(一个类可以实现多个接口);
b、接口中声明的公共属性为publicstaticfinal也只能能是publicstaticfinal的
c、接口中只能定义抽象方法,而且这些方法默认是publicabstract的,也只能是publicabstract的
d、接口可以继承其他的接口,并添加新的属性和抽象方法
e、多个无关的类可以实现同一个接口
f、一个类可以实现多个无关的接口
j、与继承关系类似、接口与实现类之间存在着多态性。
interfaceSinger{
publicabstractvoidsing();
publicabstractvoidsleep();
}
interfacePainter{
publicabstractvoidpaint();
publicabstractvoideat();
}
classStudentimplementsSinger{
privateStringname;
Student(){
this.name="无名氏";
}
Student(Stringname){
this.name=name;
}
publicStringgetName(){
returnname;
}
publicvoidstudy(){
System.out.println("Studying");
}
publicvoidsing(){
System.out.println("Studentissinging");
}
publicvoidsleep(){
System.out.println("Studentissleeping");
}
}
classTeacherimplementsSinger,Painter{
privateStringname;
Teacher(){
this.name="无名氏";
}
Teacher(Stringname){
this.name=name;
}
publicStringgetName(){
returnname;
}
publicvoidteach(){
System.out.println("Teaching");
}
publicvoidsing(){
System.out.println("Teacherissinging");
}
publicvoidsleep(){
System.out.println("Teacherissleeping");
}
publicvoidpaint(){
System.out.println("Teacherispainting");
}
publicvoideat(){
System.out.println("Teacheriseating");
}
}
classTest{
publicstaticvoidmain(String[]args){
Singers1=newStudent("lie");
s1.sing();
s1.sleep();
s1.study();
Singert1=newTeacher("steven");
t1.sing();
t1.sleep();
Paintert2=(Painter)t1;
t2.paint();
t2.eat();
}
}
接口的语法:
[接口修饰符]interface接口名称[extends父类名]{
//方法定义或者常量定义;
}
接口的实现
class类名implements接口名称{
//classbody;
}
实现接口接口的类必须实现接口中的所有抽象方法,来自接口的方法必须为public。
interfaceShap2D{
doublepi=3.141592653589793;
doublearea();
}
classCircleimplementsShap2D{
doubleradius;
publicCircle(doubleradius){
this.radius=radius;
}
publicdoublearea(){
return(pi*radius*radius);
}
}
classRectangleimplementsShap2D{
doublewidth,height;
publicRectangle(doublewidth,doubleheight){
this.width=width;
this.height=height;
}
publicdoublearea(){
return(width*height);
}
}
publicclassinterfaceTester{
publicstaticvoidmain(String[]args){
Rectanglerect=newRectangle(5,6);
Circlec=newCircle(2.0);
System.out.println(rect.area());
System.out.println(c.area());
}
}
多重继承
虽然Java不允许一个类可以继承多个父类,但允许一个类可以继承多个接口,通过这种机制可以实现多重继承。
语法:
[类修饰符]class类名implements接口1,接口2……{
//…………
}
interfaceShap2D{
publicstaticfinaldoublepi=3.141592653589793;
publicabstractdoublearea();
}
interfacecolor{
publicabstractvoidsetColor(Stringcolor);
}
classCircleimplementsShap2D,color{
privatedoubleradius;
privateStringcolor;
publicCircle(doubleradius){
this.radius=radius;
}
publicdoublearea(){
return(pi*radius*radius);
}
/*@Override*/
publicvoidsetColor(Stringcolor){
this.color=color;
}
}
publicclassMultiInterfaceTester{
publicstaticvoidmain(String[]args){
Circlec=newCircle(2.0);
c.setColor("red");
System.out.println("CircleArea:
"+c.area());
}
}
接口扩展
接口与一般类一样,可以通过扩展(extends)技术派生出新接口,原来的接口称为基本接口或者父接口,派生出来的接口称为派生接口或子接口。
接口的扩展也是通过关键字extends,但是一个接口可以继承多个接口。
语法:
interface子接口名称extends父接口名称1,父接口名称2……{
//…………
}
接口扩展举例
interfaceShap{
doublepi=3.141592653589793;
voidsetColor(Stringcolor);
}
interfaceShap2DextendsShap{
doublearea();
}
classCircleimplementsShap2D{
doubleradius;
Stringcolor;
publicCircle(doubleradius){
this.radius=radius;
}
publicdoublearea(){
return(pi*radius*radius);
}
publicvoidsetColor(Stringcolor){
this.color=color;
System.out.println("Color:
"+color);
}
}
publicclassExtendsInterfaceTester{
publicstaticvoidmain(String[]args){
Circlecir=newCircle(2.0);
cir.setColor("red");
System.out.println("Area:
"+cir.area());
}
}
2、塑型的相关知识
塑型:
类型转换,包括基本数据类型和对象类型的转换,本次实验重点强调对象的塑型。
Java支持隐式(自动)的类型转换和显示(强制)的类型转换。
对象塑型的说明:
a一个基类的引用类型变量可以“指向”其子类的对象。
b 一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)
c可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
d子类对象可以当作基类的对象来使用称为向上转型(upcasting)或隐式(自动)转型,反之成为向下转型(downcasting)或显示(强制)转型。
Person类声明了方法getName()、Employee类中声明了方法getEmployeeNumber(),Manager类中声明了方法getSalary()
(16.17KB)
4 小时前
向上转型(自动的)
基本数据类型:
容量低的向容量高的转换
对象类型:
子类向父类或者接口转换
如Employeeemp=newManager();//Manager对象塑型为Employee类
Shape2D sp =newCircle(); //Circle对象被塑型为其所实现的接口Shape2D
特点:
当一个类对象被塑型为其父类后,它提供的方法会减少,如Manager对象塑型为Employee类它只能接收getName()及getEmployeeNumber()方法,而不能接收getSalary()方法。
向下转型(强制的)
对于引用变量被自动为父类的引用变量,通过强制转型,还可以还原为本来的类型。
如:
Employeeemp=newManager();//Manager对象塑型为Employee类
Manager emp1=(Manager)emp;//塑型为本来对象后又可以接收原来的getSalary方法了。
总结对象塑型:
当一个对象被塑型为父类对象,仅仅是对象暂时当成另一种对象来对待,所提供的方法会减少,但是并没改变它的内容,当被塑型为本来类型后,又可以接收原有的方法。
方法的查找:
对象塑型前后都提供了相同的方法,那么塑型后系统会看调用哪一个类的对象?
实例方法:
从对象所创建的类中开始查找,并沿类层次向上查找.也就是从new出来的类中开始查找,并且能够覆盖父类中的方法。
类方法:
从引用变量所属于的类进行查找,即被塑型后的类查找。
请看下面例子:
classPerson{
privateStringname;
publicStringgetName(){
returnname;
}
publicvoidcomputePay(){
System.out.println("PputePay()");
}
publicstaticvoidexpense(){
System.out.println("Person.expense()");
}
}
classEmployeeextendsPerson{
privateStringemployeeNumber;
publicStringgetEmployeeNumber(){
returnemployeeNumber;
}
publicvoidcomputePay(){
System.out.println("EputePay()");
}
publicstaticvoidexpense(){
System.out.println("Employee.expense()");
}
}
classManagerextendsEmployee{
privateStringsalary;
publicStringgetSalary(){
returnsalary;
}
publicvoidcomputePay(){
System.out.println("MputePay()");
}
publicstaticvoidexpense(){
System.out.println("Manager.expense()");
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
Personp1=newPerson();
putePay();
p1.expense();
Employeee1=newEmployee();
putePay();
e1.expense();
Personp=newEmployee();
putePay();
p.expense();
Employeep2=(Employee)p;
putePay();
p2.expense();
}
}
三、实验内容
1、请看下面UML图,用接口来描述Insturmnet并分别在Wind、Percussion、Stringed中实现该接口。
2、接口的扩展。
仿照教材153页例5-7创建一个Sphere类,让其实现Shape3D接口。
要求如下:
Shape接口中有属性pi和设置颜色方法;Shape3D中有求体积方法,然后在Sphere类中实现相应接口。
3、塑型前后方法的查找。
上机调试下面程序,观察输出结果,分析并说明程序执行的过程,着重说明方法的查找顺序。
classSuper{
staticintstat=1;
intnonStat=2;
staticintstatMethod(){
return3;
}
intnonStatMethod(){
return4;
}
}
publicclassSubextendsSuper{
staticintstat=10;
intnonStat=20;
staticintstatMethod(){
return30;
}
intnonStatMethod(){
return40;
}
publicstaticvoidmain(String[]args){
Supers=newSub();
System.out.println("Staticis"+s.stat);
System.out.println("Non-Staticis"+s.nonStat);
System.out.println("Staticmethodis"+s.statMethod());
System.out.println("Non-Staticmethodis"+s.nonStatMethod());
Subsub=(Sub)s;
System.out.println("Staticis"+sub.stat);
System.out.println("Non-Staticis"+sub.nonStat);
System.out.println("Staticmethodis"+sub.statMethod());
System.out.println("Non-Staticmethodis"+sub.nonStatMethod());
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 接口 实验