Exam15Java实验十二new.docx
《Exam15Java实验十二new.docx》由会员分享,可在线阅读,更多相关《Exam15Java实验十二new.docx(14页珍藏版)》请在冰点文库上搜索。
Exam15Java实验十二new
第12次实验:
今天讲解类的多态型:
类的多态性也是面向对象的核心特征之一。
多态性是指同一名字的方法可以有多种实现,即有不同的方法体。
多态性通过方法的重载和覆盖来实现。
现在先认识方法重载。
●方法重载
什么是重载?
在同一个类中,多个方法具有相同的方法名,但采用不同的参数表,成为方法重载。
可以看以下几个式子:
Publicdoublearea(doubler)
Publicdoublearea(inta,doubleb)
Publicdoublearea(doublea,intb)
以上属于正确的重载方法头,表现为参数个数不同,或参数类型不同或参数顺序不同。
但是下面却不属于正确的重载方法。
Publicdoublearea(inta,intb)
Publicdoublearea(intx,inty)----为什么呢?
仅形参不同,但参数个数以及参数类型均相同。
下面将通过实例来理解方法重载。
1.方法重载举例
参考代码:
●方法覆盖
覆盖是指子类重定义了父类中的同名方法。
如果父类和子类具有同名方法,则称子类方法覆盖了父类方法。
为什么子类要写一个与父类同名的方法呢?
有这样一种可能,即父类的方法体不适合子类,在子类中就可以来个重新定义。
程序运行时,根据调用方法的对象所属的类决定执行父类中的方法还是子类中的同名方法。
寻找执行方法的原则是:
首先从对象所属类开始,寻找匹配的方法;如果当前类中没有匹配的方法,则依次在父类、祖先类寻找匹配的方法。
下面将通过实例来理解方法覆盖。
2.方法覆盖举例。
参考代码:
下面继续讲解final类和含final成员:
final类、final成员和final成员变量
●final类
处于安全性考虑,有些类不允许继承,可以把它定义为final类。
或者说,类的定义已经很完美,不需要再生成其子类。
格式如下:
我上课会演示给大家看(源文件名是:
C2_final.java),类似的程序你们就免了。
●final成员方法
处于安全性考虑,有些方法不允许被覆盖,可以把它声明为final方法。
可以确保调用的是正确的、原始的方法。
3.写一个“覆盖fianl方法”的程序。
参考代码:
讨论:
为什么错呢?
这是我们前面学过的方法覆盖问题,允许的。
哦!
原来如此,不能在sum()方法前加final关键字。
●final成员变量
如果一个变量被final修饰,则其值不能改变,成为一个常量。
如果在程序中企图改变其值,将引起编译错误。
格式如下:
finaldoublepi=3.14;
pi=3.14159;--------------------这样写是错的!
pi不能再修改了。
继续讲解:
第8章接口和包
首先讲解抽象类和抽象方法:
●抽象类和抽象方法
抽象类是供子类继承却不能创建实例的类。
抽象类中声明只有方法头没有方法体的抽象方法。
是不是可以找一个例子来说一下呢?
或者说在什么情况下要定义一个抽象类呢?
例如,处理平面图形,可以声明一个抽象类PGraphic ,其中包含计算图形面积的方法声明area()。
因为不同图形面积的计算公式不同,在没有确定图形形状时,无法给出area()的具体实现,所以需要将area()声明为抽象方法,此时无法创建图形对象。
然后怎么做呢?
通过继承PGraphic类,定义圆形类PCircle,在PCircle中给出area()的方法体,实现圆面积的计算功能;通过继承PGraphic类,定义长方形类PRectangle,在PRectangle中给出area()的方法体,实现计算长方形面积的功能;等等…又例如有PTriangle…。
概念比较多,还是通过实例来加以理解。
4.利用抽象类表示多类图书。
参考代码:
(下面还有代码….)
下面讲p.101的接口,即声明接口和实现接口:
●什么是接口?
接口是一组常量和抽象方法的集合。
与抽象类相似,接口只声明抽象方法,不给出方法体,由实现接口的类去实现所声明的抽象方法。
接口提供了方法声明与实现相分离的机制,使实现接口的多个类表现出相同的行为模式。
每个实现接口的类可以根据各自要求,给出抽象方法的具体实现。
接口需要使用关键字interface声明,其形式如下:
说明:
(1)接口的访问权限只有两种:
public和缺省权限,与类的访问权限类似。
(2)一个接口可以继承其他接口,称为父类接口。
它将继承父类接口中声明的常量和抽象方法。
(3)成员变量表中的成员变量只能是公有的、静态的常量,即形式如下:
publicstaticfinal成员变量名=常量;
正因为如此,书写时关键字public、static和final都可以省略不写。
(4)接口体中定义的方法都是公有的、抽象的,形式如下:
publicabstract返回值类型成员方法名(参数表);
正因为如此,书写时public和abstract都可以省略不写。
看一个例子:
interfaceshape1
{
publicstaticfinalPI=3.14159;
publicabstractdoublearea();
publicabstractdoublevolume();
publicabstractvoidshow();
}
根据刚才讲的,又可以写成什么?
同学自己来说….。
……………………
……………………
……………………
●什么是接口实现?
接口中声明了常量和抽象方法,其中抽象方法需要在实现接口的类中加以实现。
类实现接口使用关键字implements,声明形式如下:
说明:
(1)一个类可以实现多个接口,各个接口之间用逗号分开。
其实,这就是所谓的,接口使实现多种继承有了可能。
(2)实现接口的类必须要实现接口中所有的抽象方法,即使本类中不使用某抽象方法,也必须实现它,通常用空方法体实现不需要返回值的抽象方法,而用返回默认值(如0)的方法体实现需要返回值的抽象方法。
(3)在实现抽象方法时,需要指定public访问权限,否则会产生访问权限错误。
下面将通过实际例子强化这方面的理解。
实现接口举例:
参考代码如下:
下面还有代码:
看p.103,书上将接口与抽象类作一个比较,指出它们既有相同之处,也有不同之处。
具体可以看p.103的①….②….③…。
●你有兴趣吗?
如果有兴趣,可以看【例8-3】利用接口代替抽象类实现例8-1的功能。
我觉得可以考虑做一做,我认为,例题8-4不作要求,例题8-3可
以做一下,参考代码如下:
今天我想给大家做三道题目,代码不再给了,是放手的时候了….!
)
第1题:
写一个程序即打印如下左侧给出的图案。
文件取为:
Mypattern.java----------为为什么我要这样做?
有一次偶然的机会,看到题库里这样一个题目,如果让你突然面对,你会不会束手无策。
另一方面,也可以把此作为一个独立作业,检查一下大家的编程能力。
你的编程怎么样?
提高了吗?
提高了多少?
上机考试你准备好了吗?
(提示:
图案是否可考虑采用字符串呢?
例如,由一个星号和一个空格组成:
”*“
第2题:
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat(0读入一个正整数n(1<=n),再读入n阶方阵a,计算该矩阵除4条边以外的所有元素之和sum.
输出
例:
括号内是说明
输入
1(repeat=1)
4(n=4)
1111
1231
1451
1111
输出:
sum=14(2+3+4+5=14)
importjava.util.*;
publicclass徐2{
publicstaticvoidmain(String[]args){
intri,repeat,a[][],i,j,sum,n;
Scannerin=newScanner(System.in);
repeat=in.nextInt();
for(ri=1;ri<=repeat;ri++)
{
n=in.nextInt();
a=newint[n][n];
for(i=0;ifor(j=0;ja[i][j]=in.nextInt();
/********************/
System.out.println("sum="+sum);
}
}
}
第3题:
程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat(0输入一个正整数n(1例:
括号内是说明
输入
2(repeat=2)
5345667789
63446677867865
输出
11
2
importjava.util.Scanner;
publicclass谢1{
publicstaticvoidmain(String[]args){
intri,repeat,i,j,n,d,a[];
Scannerin=newScanner(System.in);
repeat=in.nextInt();
for(ri=1;ri<=repeat;ri++){
n=in.nextInt();
a=newint[n];
/*******************/
System.out.println(d);
}
}
}