Java语言面向对象知识小结及答疑Word下载.docx
- 文档编号:15833089
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:14
- 大小:31.95KB
Java语言面向对象知识小结及答疑Word下载.docx
《Java语言面向对象知识小结及答疑Word下载.docx》由会员分享,可在线阅读,更多相关《Java语言面向对象知识小结及答疑Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
}
A(intx){
this.x=x;
}
voidprint(){
System.out.println(“x=”+x);
}
默认情况下,A()构造方法默认是会自动生成的,当然里面一点代码都没有(也就是说,你不写的话,系统会帮你写上一个空架子的构造方法)。
构造方法前面必须是没有“返回类型”的。
另外,类中的任何除构造方法之外的其它方法必须要“返回类型”的。
方法重载:
在类中存在两个同名的方法,但方法的参数类型不相同。
voidprint(intx){…}
voidprint(inta){…}
注意,上面写的这两个方法不能叫重载的(参数个数、类型完全相同)
方法重写/覆盖:
在子类和父中存在两个同名、同参数的方法。
访问修饰符:
private,protected,public,(默认)
static,final
对类中的一个static方法来说,它可以直接通过类名进行调用,而不需要生成对象。
final放在一个变量前面,表示这是一个常量,只能有一个值。
final放在一个方法前面,表示这是一个不能被覆盖的方法。
final放在一个类前面,表示这是一个最终类,它不能被别的类继承。
抽象类:
就是在class之前加了一个abstract的类,这样的类就不能用来生成对象了。
因此,通常如果一个类不适合生成对象的话,我们就要把这个类定义成抽象的。
或者,如果一个类中包含了没有方法体的方法(也就是抽象方法),这样的类也必须定义成抽象类。
其它类继承了抽象类的话,就必须补全这个抽象类中的所有抽象方法的具体代码。
abstractclassA{
abstractvoidprint();
接口:
在其中只定义抽象方法。
接口的目的,是为了强制某些类中必须具有同样的方法。
因此,只要类实现了接口,这些类就必须提供接口中方法的具体代码。
因此这些类看起来就有了一些共性了(都包含了接口中规定的方法)。
这是接口的一个强制规定。
此外,接口中的抽象方法必须是public的,如果不写上的话,系统会自定帮我们加上。
习惯上我们还是自己写上public。
interfaceC{
publicvoidprint();
classAimplementsC{
publicvoidprint(){
classBimplementsC{
System.out.println(“hello”);
上面的类A和类B因为实现了接口C,它们就必须提供接口C中规定的方法/函数,否则编译就报错了。
这就是接口的一大特点。
接口可以这样使用:
Cc=newA();
c.print();
//其实是调用A类的对象中的print()方法
c=newB();
//其实是调用B类的对象中的print()方法
可见,接口变量能够指向任何实现了该接口的类的对象,但只能调用对象中的那些“由接口规定的”方法。
对接口变量c来讲,无论它指向的是A类对象还是B类对象,接口变量c只知道对象中有print()方法(也就是接口C中规定的方法),对象中的其它内容,接口变量c则一无所知。
如同一个USB接口,可以插上任何实现了USB接口的实际设备,如插上优盘、移动硬盘等等。
但是若移动硬盘还有MP3播放功能的话,我们的USB接口也不会知道。
USB接口仍会把这种带有MP3播放功能的移动硬盘当作普通的移动硬盘来对待。
那么在Java中又为什么需要接口呢?
我们再看上面的这两个类,改写一下(去掉了implementsC语句):
classA{
classB{
现在的类A、B定义只是少了implementsC,里面的内容和前面一模一样。
唯一的不同是,类A、B里面的方法名字可以随便更改了(不会受任何约束):
publicvoidprint222(){
publicvoidshow(){
System.out.println(“----”);
我们看到,现在的A、B类里面已经乱七八糟了,甚至B类中连print()方法都没有了。
但这两个类在编译时没有任何问题,它们只是没有遵守统一的接口约定而已。
为了更好地理解面向对象这些概念,请同学们务必仔细琢磨明白提供的那几个程序文件:
子类构造方法\Abc.java
抽象类\Abc.java
接口\Abc.java
方法修饰符\Abc.java
方法重写\Abc.java
方法重载\Abc.java
继承\Abc.java
访问修饰符\Abc.java
二、异常
异常的设计,主要是提供一种集中处理问题的机制。
大家体会一下下面的两个例子。
这个例子是教材上的一个上机练习(教材第329页的练习1),其目的是计算一个从键盘输入数的阶乘(args[0]就是一个从键盘上输入的数字字符串)。
常规的做法是这样的:
//判断是否在命令行中输入了字符串。
args是一个数组变量
//如果数组大小少于1的话,说明使用者没有输入要计算阶乘的那个数
if(args.length<
1){
System.out.println("
请提供一个数字!
!
"
);
return;
//判断输入的字符串是否全部是数字。
我们只要判断字符串args[0]中
//包含的每一个字符是否都是数字,就可以确定输入的是否是数字
Stringstr=args[0];
for(inti=0;
i<
str.length();
i++)
if(str.charAt(i)<
'
0'
||str.charAt(i)>
9'
){
System.out.println("
提供的参数不是数字"
//将从键盘输入的数字字符串转换成一个整数,并是否是正数
num=Integer.parseInt(args[0]);
if(num<
=0){
难道要计算负数的阶乘?
//计算num的阶乘,存放在n变量中
for(i=1;
=num;
n=n*i;
System.out.println(args[0]+"
的阶乘是:
+n);
我们发现,如果是按常规做法,步骤非常繁琐。
而如果使用try-catch的话就好很多:
try{
num=Integer.parseInt(args[0]);
=0)
thrownewIllegalArgumentException();
}catch(ArrayIndexOutOfBoundsExceptione1){
System.out.println("
}catch(NumberFormatExceptione2){
}catch(IllegalArgumentExceptione3){
}
上面的代码是标准的参考代码,使用try-catch可以看出代码的清晰程度(我们将来会大量使用下面的这种处理问题的方式)。
如果try中的任一行代码在执行时抛出一个异常的话,接下来的catch就要开始工作了。
如果我们要使得一个普通方法在调用时也有能力抛出异常,我们就需要这样定义我们自己写的方法:
voidcheck(intx)throwsIllegalArgumentException{
if(x<
0){
thrownewIllegalArgumentException();
这个方法和普通方法差不多,就是后面跟着一个:
throwsIllegalArgumentException,表示这个方法有可能会抛出一个IllegalArgumentException这样的异常,因此在调用时就必须通过try-catch进行捕捉处理。
现在可以这样调用上面的check()方法了:
check(num);
你可以想像一下,系统中的Integer.parseInt()方法就是按照类似我们上面的做法实现的。
现在有同学就会问了,我们怎么知道什么时候要抛出什么样的异常呢?
其实,上面我们只是选择了一个标准的异常类IllegalArgumentException(非法参数异常。
Illegal是“非法”的意思,Argument是“参数”的意思,Exception是“异常”的意思)。
我们在课堂中给大家看了一些从Exception继承而来的标准异常类,如果这些类可以使用的话,我们就可以直接选择其中一个适合我们处理情况的类来使用,就像我们上面做的一样。
否则,就要自定义异常类了(必须从Exception继承):
classFushuExceptionextendsException{
FushuException(){/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 语言 面向 对象 知识 小结 答疑