Java语言程序设计复习要点.pdf
- 文档编号:14651321
- 上传时间:2023-06-25
- 格式:PDF
- 页数:14
- 大小:217.39KB
Java语言程序设计复习要点.pdf
《Java语言程序设计复习要点.pdf》由会员分享,可在线阅读,更多相关《Java语言程序设计复习要点.pdf(14页珍藏版)》请在冰点文库上搜索。
3.13.1Java语言的面向对象特性语言的面向对象特性3.2.13.2.1类类类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素。
Java语言是建立在类这个逻辑结构之上,所以Java是一种完全面向对象的程序设计语言。
类是Java的核心,Java程序都由类组成,一个程序至少要包含一个类,也可以包含多个类。
对象是类的实例,Java程序中可以使用标识符表示对象,并通过对象引用类中的变量和方法。
类封装了一类对象的状态和方法,是这一类对象的原形。
一个类的实现包括两个部分:
类声明和类体。
11类的声明类的声明类通过关键字class来创建,下面的声明语句格式给出了可能出现的符号和顺序:
publicabstractfinalextends父类父类implements接口接口其中,表示为可选项,表示为必选项。
关键字含义说明如下:
class类名类名class关键字告诉编译器这是一个类,类名是可以自由选取但必须是合法的标识符。
在声明类的语句中,class前面的关键字称为类的修饰符。
public(公共的)(公共的)在没有任何修饰符的缺省情况下,类只能被同一个源程序文件或同一个包中的其它类使用,如例4.3中的MyBox只能被ClassDemo2使用。
加上public修饰符后,类可以被任何包中的类使用,称为公共类。
有关包的概念请参考后面章节的内容(目前可把包当作一个源程序文件)。
abstract(抽象的)(抽象的)有时,定义的类代表了一个抽象的概念,就不能用它来实例化一个对象。
同样在OOP中,可能建立了一个不需要产生对象的类。
例如,java.lang包中的Number类代表了数这个抽象概念,可以用它在程序中产生一个数的子类,如Interger或Float,但从Number中直接生成对象是没有意义的。
abstract说明的类称为抽象类,不能用它实例化一个对象,它只能被继承。
final(最终的)(最终的)final说明的类称为最终类。
一个最终类不可能有子类,也就是说它不能被继承。
在设计类时,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。
final类不能被继承,因此,final类的成员方法没有机会被覆盖,默认都是final的。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
为什么要把一个类说明为最终类呢?
有两点理由:
为了提高系统的安全性和出于对一个完美类的偏爱。
黑客常用的一个攻击技术是设计一个子类,然后用它替换原来的父类。
子类和父类很相象,但做的事情却大不一样。
为防止这样的事情发生,你可以把你的类声明为最终类,不让黑客有机可乘。
extends(继承)父类名(继承)父类名extends告诉编译器创建的类是从父类继承下来的子类,父类必须是Java系统类或已经定义的类。
从父类继承,可以提高代码的重用性,不必从头开始设计程序。
大部分情况下应该利用继承的手段编程,只在没有合适的类可以继承时才自己设计类。
implements(实现)接口名(实现)接口名implements告诉编译器类实现的接口,接口必须有定义,一般为系统类。
接口是消息传递的通道,通过接口,消息才能传递到处理方法中进行处理。
implements说明你的类可以实现的一个或多个接口,如果有多个接口,要用逗号分隔。
关于接口的设计和使用请参考第6章的内容。
说明:
说明:
Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干修饰符来修饰限定所定义的类的特性。
类的修饰符分为访问控制符和非访问控制符两大类。
修饰符之间的先后排列次序对类的性质没有任何影响。
下表展示了非访问控制符对类、变量和方法的修饰作用。
JavaJava中非访问控制修饰符中非访问控制修饰符修饰符修饰符类类变量变量方法方法abstract抽象类抽象方法final最终类最终变量最终方法static静态变量静态方法volatile易失变量native本地方法synchronized同步方法访问控制符是组限定类、域或方法是否可以被程序里的其他部分访问和调用的修饰符。
类的访问控制符只有一个public,变量和方法的访问控制符有3个,分别是public、private和protected。
另外还有一种没有定义专门的访问控制符的默认情况。
JavaJava中的访问控制修饰符中的访问控制修饰符修饰符修饰符类类变量变量方法方法publicprotected默认无修饰符privateJavaJava中的访问控制符的控制范围中的访问控制符的控制范围控制范围控制范围publicprotected默认无修饰符private同一类中可见同一包中对子类可见同一包中对非子类可见不同包中对子类可见不同包中对非子类可见22类体类体类体主要用来描述类所具有的状态和具备的行为(功能)。
其中,成员变量(有时也称为属性、数据、域)描述了类和对象的状态,成员方法则描述了类所具备的功能。
对成员变量的操作实际上就是改变类和对象的状态,使之能满足程序的需要。
对象的行为由类的方法实现,其它对象可以调用一个对象的方法,通过消息的传递实现对该对象行为的控制。
与类相似,成员变量/成员方法也有很多修饰符,用来控制对成员变量的访问,实现对类和对象的封装。
类体定义如下:
classclassName/成员变量成员变量public|protected|privatestaticfinaltransientvolatiletypevariableName;/成员方法成员方法public|protected|privatestaticfinal|abstractnativesynchronizedreturnTypemethodName(paramList)throwsexceptionListStatements33成员变量成员变量成员变量声明的格式和顺序如下:
public|protected|privatestaticfinaltransientvolatiletypevariableName;其中,static:
静态变量(类变量);相对于实例变量final:
常量transient:
暂时性变量,用于对象存档volatile:
共享变量,用于并发线程的共享不同含义的修饰符:
访问控制权限访问控制权限public公共变量公共变量由public修饰的变量称为公共变量,可被任何包中的任何类访问,只有在确认任何外部访问都不会带来不良后果的情况下才将成员声明为公共的。
公共变量对任何类都是可见的,因此它没有秘密可言,不具有数据保护功能。
private私有变量私有变量由private修饰的变量称为私有变量,只能被声明它的类所使用,拒绝任何外部类的访问。
私有变量是不公开的,它们得到了最好的保护,这是对类进行封装时使用的主要方法。
protected受保护变量受保护变量由protected修饰的变量称为受保护变量,可被声明它的类和派生的子类以及同一个包中的类访问。
package包变量包变量由package修饰的变量称为包变量,在声明时常常省略package关键字,即没有修饰符的成员被视为包成员。
包成员可被声明它的类和同一个包中的其它类(包括派生子类)所访问,在其它包中的子类则不能访问父类的包成员。
表3-1列出了这些限定词的作用范围。
【表3-1】java中类的限定词的作用范围比较同一个类同一个类同一个包同一个包不同包的子类不同包的子类不同包非子类不同包非子类private*default*protected*public*static静态变量静态变量static声明的成员变量被视为类的成员变量,而不把它当作实例对象的成员变量。
换句话说,静态变量是类固有的,可以直接引用,其它成员变量仅仅被声明,生成实例对象后才存在,才可以被引用。
基于这样的事实,也把静态变量称为类变量,非静态变量称为实例变量。
相应地,静态方法称为类方法,非静态方法称为实例方法。
【例【例3.1】静态变量的使用。
静态变量的使用。
classStaticDemostaticintx;inty;staticpublicintgetX()returnx;staticpublicvoidsetX(intnewX)x=newX;publicintgetY()returny;publicvoidsetY(intnewY)y=newY;publicclassShowDemopublicstaticvoidmain(Stringargs)System.out.println(静态变量x=+StaticDemo.getX();/System.out.println(实例变量y=+StaticDemo.getY();/非法,编译时将出错StaticDemoa=newStaticDemo();StaticDemob=newStaticDemo();a.setX
(1);/ThestaticmethodsetX(int)fromthetypeStaticDemoshouldbeaccessedinastaticwaya.setY
(2);b.setX(3);b.setY(4);System.out.println(静态变量a.x=+a.getX();System.out.println(实例变量a.y=+a.getY();System.out.println(静态变量b.x=+b.getX();System.out.println(实例变量b.y=+b.getY();将源程序中的出错语句删除或使用解释符/隐藏起来如:
/System.out.println(“实例变量y=”+StaticDemo.getY();/非法,编译时将出错,再进行编译,即可执行该程序,从输出结果中可以得出以下几点结论:
类的静态变量可以直接引用,例如在程序中直接使用了StaticDemo.getX(),而非静态变量则不行。
类的静态变量相当于某些程序语言的全局变量。
静态方法只能使用静态变量,不能使用实例变量。
类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。
对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。
静态变量可以在静态块中被初始化。
final最终变量最终变量一旦成员变量被声明为final,在程序运行中将不能被改变。
这样的成员变量就是一个常量。
例如:
finaldoublePI=3.14159;该语句声明一个常量PI,如果在后面试图重新对它赋值,将产生编译错误。
另外,常量名一般用大写字母。
常量和直接量一样不占用内存空间。
(11)ffinalinal成员只能被初始化一次;成员只能被初始化一次;(22)ffinalinal成员必须在声明时或者在构造方法中被初始化,而不能在其他的地方被初始化。
成员必须在声明时或者在构造方法中被初始化,而不能在其他的地方被初始化。
(33)对于对于finalstaticfinalstatic类型成员变量,类型成员变量,staticstatic使得变量只存在一个副本,使得变量只存在一个副本,finalfinal使得它不能被改变。
使得它不能被改变。
transient过渡变量过渡变量Java语言目前对transient修饰符没有明确说明,它一般用在对象序列化(objectserialization)上,说明成员变量不允许被序列化。
volatile易失变量易失变量volatile声明的成员变量为易失变量,用来防止编译器对该成员进行某种优化。
这是Java语言的高级特性,仅被少数程序员使用。
44成员方法成员方法类的设计集中体现在成员方法的设计上。
良好的设计可以使类更加强壮,功能更加完善。
成员方法的设计应该从类的整体行为出发,能正确响应外部消息,自然地改变对象的状态,并符合相对独立性、结构清晰、可重用性强等编程要求。
成员方法相当于其它语言的函数或过程,是命令语句的集合。
成员方法的实现包括两部分内容:
方法声明和方法体。
方法体是对方法的实现,它包括局部变量的声明以及所有合法的Java指令。
成员方法的声明一般放在成员变量的声明之后,声明语句的格式和顺序如下:
public|protected|privatestaticfinal|abstractnativesynchronizedreturnTypemethodName(paramList)throwsexceptionList/方法声明方法声明statements/方法体方法体方法声明中的限定词的含义:
方法声明中的限定词的含义:
static:
类方法,可通过类名直接调用类方法,可通过类名直接调用abstract:
抽象方法,没有方法体抽象方法,没有方法体final:
方法不能被重写方法不能被重写native:
集成其它语言的代码集成其它语言的代码synchronized:
控制多个并发线程的访问控制多个并发线程的访问方法声明中不同修饰符的含义方法声明中不同修饰符的含义如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
final最终方法最终方法如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
方法被声明为最终方法后,将不能被子类覆盖,即最终方法能被子类继承和使用但不能在子类中修改或重新定义它。
这种修饰可以保护一些重要的方法不被修改,尤其是那些对类的状态和行为有关键性作用的方法被保护以后,可以避免未知情况的发生。
使用final方法的原因有二个:
把方法锁定把方法锁定,防止任何继承类修改它的意义和实现;高效高效。
编译器在遇到调用final方法时会转入内嵌机制,大大提高执行效率。
在OOP中,子类可以把父类的方法重新定义,使之具有新功能但又和父类的方法同名、同参数、同返回值,这种情况称为方法覆盖(override)。
abstract抽象方法抽象方法一个抽象类可以含有抽象方法。
所谓抽象方法是指不能实现的方法,因为它没有方法体,所以抽象方法不能出现在非抽象类中。
为什么要使用抽象类和抽象方法呢?
一个抽象类可以定义一个统一的编程接口,使其子类表现出共同的状态和行为,但各自的细节是不同的。
子类共有的行为由抽象类中的抽象方法来约束,而子类行为的具体细节则通过抽象方法的覆盖来实现。
这种机制可增加编程的灵活性,也是OOP继承树的衍生基础。
native本地方法本地方法用其它语言编写的方法在Java中称为本地方法。
如果你有一个用其它语言如C+写成的函数,希望在Java中能利用这些资源,你可以编写本地方法。
SDK提供了Java本地接口JNI(JavaNativeInterface),使得Java虚拟机能运行嵌入在Java程序中的其它语言的代码。
这些语言包括C/C+、Fortran、汇编语言等等。
嵌入外部语言代码出于以下几点考虑:
Java系统包不提供对平台依赖性程序的支持时;想利用现有的其它语言资源时;出于运行速度的要求而使用其它语言开发的运行模块。
synchronized同步方法同步方法同步方法用于多线程编程。
多线程在运行时,可能会同时存取一个数据。
为避免数据的不一致性,应将方法声明为同步方法,对数据进行加锁,以保证线程的安全。
详细内容请参考第8章。
throws异常类型异常类型程序在运行时可能发生异常现象。
每一个异常都对应着一个异常类,如果希望方法忽略某种异常,可将其抛出,使程序得以继续运行。
在前面介绍的例中就使用过抛出异常throwsIOException(输入/输出异常),有关异常处理的详细内容请参考第6章。
返回值类型返回值类型Java要求一个方法必须声明它的返回值类型。
如果方法没有返回值就用关键字void作为返回值类型,否则应使用基本数据类型或对象类型说明返回值类型,如下面的语句:
publicintgetX();voidsetXY(intx,inty);publicStringgetName();protectedObjectclone();其中,getX的返回值为int类型,setXY没有返回值,getName的返回值是String类。
而clone的返回值则为Object类。
方法名方法名方法名可以是任何有效的Java标识符。
方法名可以和成员变量同名,也可以和成员方法同名。
同一个类中的方法同名现象在OOP中称为方法重载(overload),重载使一个类的多个方法享有同一个名称,可以减轻程序员的负担。
参数表参数表方法的调用者正是通过参数表将外部消息传递给方法加以处理的。
在参数表中要声明参数的类型,并用逗号分隔多个参数。
注意:
注意:
方法体中声明的局部变量的作用域在该方法内部。
若局部变量与类的成员变量同名,则类的成员变量被隐藏。
【例【例3.2】局部变量的作用域局部变量的作用域该例说明了局部变量z和类成员变量z的作用域是不同的。
classVariableintx=0,y=0,z=0;/类的成员变量voidinit(intx,inty)this.x=x;this.y=y;intz=5;/局部变量System.out.println(*ininit*);System.out.println(x=+x+y=+y+z=+z);publicclassVariableTestpublicstaticvoidmain(Stringargs)Variablev=newVariable();System.out.println(*beforeinit*);System.out.println(x=+v.x+y=+v.y+z=+v.z);v.init(20,30);System.out.println(*afterinit*);System.out.println(x=+v.x+y=+v.y+z=+v.z);上例中我们用到了this,这是因为init()方法的参数名与类的成员变量x,y的名字相同,而参数名会隐藏成员变量,所以在方法中,为了区别参数和类的成员变量,我们必须使用this。
this用在一个方法中引用当前对象,它的值是调用该方法的对象。
返回值须与返回类型一致,或者完全相同,或是其子类。
当返回类型是接口时,返回值必须实现该接口。
方法体包含在一对大括号中,即使方法体中没有语句,一对大括号也是必不可少的。
使用各种语句结构组成方法主体,实现程序的功能,是设计方法体的目的。
下面这段程序是一个处理格式化字符串的方法:
publicStringtoString(intarr)inti,n=arr.length;StringBuffers=newStringBuffer();s.append();for(i=0;in;i+)s.append(Integer.toString(arri);if(in-1)s.append(,);s.append();returns.toString();55消息传递消息传递一个对象和外部交换信息主要靠方法的参数来传递。
当然,如果允许的话,外部对象也可以直接存取一个对象的成员变量。
出于整体考虑,大部分还是通过参数来传递。
在Java中,可传递的参数包括任何数据类型,前面已经使用了基本数据类型的参数传递、数组的传递和对象的传递。
在其它语言中,函数调用或过程调用有传值调用和传地址调用之分。
方法声明包括方法名、返回类型和外部参数。
其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。
对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。
如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
【例【例3.3】简单数据类型参数与引用数据类型参数消息传递方式的区别】简单数据类型参数与引用数据类型参数消息传递方式的区别publicclassPassTestfloatptValue;publicstaticvoidmain(Stringargs)intval;PassTestpt=newPassTest();val=11;System.out.println(OriginalIntValueis:
+val);pt.changeInt(val);/值参数System.out.println(IntValueafterChangeis:
+val);/值参数,值的修改,没有影响值参数的值pt.ptValue=101f;System.out.println(OriginalptValueis:
+pt.ptValue);pt.changeObjValue(pt);/引用类型的参数System.out.println(ptValueafterChangeis:
+pt.ptValue);/引用参数值的修改,改变了引用参数的值publicvoidchangeInt(intvalue)value=55;/在方法内部对值参数进行了修改publicvoidchangeObjValue(PassTestref)ref.ptValue=99f;/在方法内部对引用参数进行了修改66方法重载方法重载方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同,或者是参数的个数不同,或者是参数类型不同。
返回类型不能用来区分重载的方法。
参数类型的区分度一定要足够,例如不能是同一简单类型的参数,如int与long。
【例【例3.4】方法重载】方法重载classMethodOverloadingvoidreceive(inti)System.out.println(Receiveoneintdata);System.out.println(i=+i);voidreceive(intx,inty)System.out.println(Receivetwointdatas);System.out.println(x=+x+y=+y);publicclassMethodOverloadingTestpublicstaticvoidmain(Stringargs)MethodOverloadingmo=newMethodOverloading();mo.receive
(1);mo.receive(2,3);77构造方法构造方法构造方法是一个特殊的方法。
Java中的每个类都有构造方法,用来初始化该类的一个对象。
构造方法具有和类名相同的名称,而且不返回任何数据类型。
重载经常用于构造方法。
构造方法只能由new运算符调用【例3-4】classPointintx,y;Point()x=0;y=0;Point(intx,inty)this.x=x;this.y=y;格式:
objectReference.variableobjectReference是一个已生成的对象,也可以是能生成对象的表达式例:
p.x=10;tx=newPoint().x;调用对象的方法调用对象的方法格式:
objectReference.methodName(paramlist);例如:
p.move(30,20)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 语言程序设计 复习 要点