




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java中主要修饰符的使用(周双)武汉理工大学计算机学院软件sy1001班周双(0121010680234) Java中定义了6个常用修饰符:public、protected、private、abstract、static、final。访问控制符:公开级别:public;受保护级别:protected;默认级别: friendly(一般不指明);私有级别: private。类只能使用public和默认级别修饰。其中类的属性和方法可以使用上述4个访问修符;局部变量不可以使用访问修饰符;常用的方法是将类的属性设为private,而将类的方法设为public。abstract修饰符:abstract修饰符可以用来修饰类和成员方法:用abstract修饰抽象类,表示该类不可以被实例化。相对应的则称为具体类。用abstract修饰的方法成为抽象方法,该方法没有方法体。 抽象方法用来描述系统具有什么功能。final 修饰符:final修饰符表示不可以改变的含义。final修饰符可以用来修饰类,成员方法,和成员变量。用final修饰类,表示该类不可以被继承;用final修饰成员方法,表示该方法不可以被覆盖(override);用final修饰变量,表示一旦赋值就不可以被改变。注意,final变量必须被显式初始化。对于实例变量可以在定义时或在构造方法中进行初始化。而类变量(static变量)必须在定义时进行初始化。对于final修饰的引用类型,那么该变量在其生命周期中只能指向同一个对象,但可以改变对象的值。Static修饰符:static成员变量表示静态变量,可以直接通过类名来访问。static成员方法表示静态方法,可以直接通过类名来访问。由于static方法中,只可以访问静态变量和方法,所以要想访问一个实例变量或方法,则必须要先得到相应的对象的引用,才能访问其变量和方法。1、 类的修饰符 Java程序在定义类时,除恶额使用class关键字标识外,还可以在在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类,下面主要讨论类的费访问控制符。1.1抽象类 凡是用abstract修饰符修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。比如电话卡有很多类型,磁卡、IC卡、IP卡、200卡、300卡、校园201卡。不同种类的卡有各自的特点,例如磁卡和IC卡没有卡号和密码;使用200卡每次通话要多扣除0.1元的附加费等。同时它们也拥有一些共同的特点,如每张卡都有剩余的金额,都有通话的功能。为此,可以定义一种集合了所有种类的电话卡的公共特点的抽象电话卡如下:Abstract class PhoneCard double balance; void performDial() 抽象类是它的所有子类的公共属性的集合,所以使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。 1.2最终类如果一个类被final修饰符所修饰和限定,说明这个类不能再有子类。被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类。将一个类定义为final则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而引用这个类时所实现的功能的正确无误。注意:abstract和final修饰符不能同时修饰一个类,因为abstract类自身没有具体对象,需要派生出子类后再创建子类的对象;而final类不可能有子类,这样abstract final类就无法使用,也就没有意义了。但是abstract和final可以各自与其他大的修饰符合用。例如一个类可以是public abstract的也可以是public final的。2、 域 本文只介绍静态域和最终域的特点与使用方法。2.1静态域 用static修饰符修饰的域是仅属于类的静态域。静态域最主要的特点是:它们是类的域,不属于任何一个类的具体对象。它不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元。换句话说,对于该类的任何一个具体对象而言,静态域是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值;同样任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作。下面的程序片段中定义了两个静态域。class PhoneCard200 Static String connectNumber = “200”; Static double additoryFee; long cardNumber; int password; boolean connected; double balance; 上面程序定义了对应200电话卡的类PhoneCard200.由于所有的200电话卡的接入号码都是“200”,所以定义类的静态域connectNumber标志所有PhoneCard200对象共有的接入号码;同时使用200电话卡通话的附加费对每张电话卡也是一致的,所以定义类的静态域additoryFee.下面的程序将验证静态域是类中每个对象共享的域。例1 TestStaticField.javapublic class TestStaticField public static void main(String args) PhoneCard200 my200_1=new PhoneCard200(); PhoneCard200 my200_2=new PhoneCard200(); my200_1.additoryFee=0.1; System.out.println(第二张200卡的附加费:+my200_2.additoryFee); System.out.println(200卡类的附加费:+PhoneCard200.additoryFee); class PhoneCard200 static String connectNumber = 200; static double additoryFee; long cardNumber; int password; boolean connected; double balance;运行结果如下图:有结果可知,类的静态域可以成为该类各个对象共享的变量,便于实现一个类不同对象之间的通信。2.2最终域final是用来修饰常量的修饰符,一个类的域如果被声明为final,那么它的值在程序的整个执行过程中都不能改变。例如PhoneCard200类中的接入号码,对于200电话卡是固定的字符串“200”,根据问题的实际情况,这个数据不需要也不应该被改变,所以可以把它定义为最终域。static final String connectNumber = 200;用final修饰符说明常量时,需要注意以下几点:(1) 需要说明常量的数据类型。(2) 需要同时指出常量的具体取值。(3) 因为所有类对象的常量成员,其取值都固定一致,为了节省空间,常量通常声明为static.最终域的使用在系统类中也很常见。例如在java.lang包中,有一个Integer类,它的两个域定义如下: public static final int MAX_VALUEpublic static final int MIN_VALUE从上述定义可以看出:它们都是最终域(常量),而且也都是静态域。MAX_VALUE域和MIN_VALUE域分别存储int类型数据的最大值(2147483647)和最小值(-2147483648)。Integer正是利用这两个域为我们提供了int类型的数据的范围。除静态域和最终域之外,域还有其他类型,例如易失域。如果一个域被volatile修饰符所修饰,说明这个域可能同时被几个线程所控制盒修改,即这个域不仅仅被当前程序所掌握,在运行过程中可能存在其他未知的程序操作来影响和改变该域的取值。在使用当中应该特别留意这些影响因素。通常,volatile用来修饰接受外部输入的域。如表示当前时间的变量将由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时间,所以可以把它定义为易失域。3、 方法 方法的修饰符也分为访问控制符和非访问控制符两大类,常用的非访问控制符把方法分成若干种,下面介绍几种用于特定场合的方法。3.1抽象方法 修饰符abstract修饰的抽象方法是一种仅有方法头,而没有具体方法体和操作实现的方法。例如,下面的拨打电话的方法performDial()就是抽象类PhoneCard中定义的一个抽象方法。abstract void performDial();可见,abstract方法只有方法头的声明,后面没有大括号包含的方法体。那么为什么不定义方法体呢?因为电话卡类是从所有电话卡中抽象出来的公共特性的集合,每种电话卡都有“拨打电话”的功能,但是每种电话卡的“拔打电话”的功能的具体实现(具体操作)都不相同。例如IC卡电话机就可以通话;而200卡则需要在双音频电话中先输入正确的卡号和密码。所以PhoneCard的不同子类的performDial()方法虽然有相同目的,但其方法体是各不相同的。针对这种情况为PhoneCard类定义一个方法体的抽象方法performDial(),至于方法体的具体实现,则留到当前类的不同子类在它们各自的类定义中完成。也就是说,各子类在继承了父类的抽象方法之后,再分别用不用的语句和方法体来重新定义它,形成若干个名字相同,返回值相同,参数列表也相同,目的一致但是具体实现有一定的差别的方法。使用抽象方法的目的是使所有的PhoneCard类所有子类对外都呈现一个相同名字的方法,是一个统一的接口。当然,定义abstract方法也有特别的优点,及时可以隐藏具体的细节信息,是调用的程序不必过分关注类内部的具体情况。由于所有的子类使用的都是相同的方法头,而方法头实际包含了调用该方法的全部信息,所以一个希望完成“拨打电话”操作的语句,可以不必知道它调用的是哪个电话卡子类的performDial()方法,而仅仅使用PhoneCard类的performDial()方法就足够了。需要特别注意的是,所有的抽象方法,都必须存在于抽象类之中。一个非抽象类中出现抽象方法是非法的。也就是说,一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。不过抽象类不一定只能拥有抽象方法,它可以包含非抽象方法。下面的例子将体现上面的内容。例2:TestAbstract.javapublic class TestAbstract public static void main(String args) PhoneCard200 my200=new PhoneCard200(50.0); IC_Card myIC=new IC_Card(50.0); System.out.println(200卡可以拨打+my200.TimeLeft()+次电话。); System.out.println(IC卡可以拨打+myIC.TimeLeft()+次电话。); abstract class PhoneCard double balance; abstract void performDial(); double TimeLeft() double current = balance; int times = 0; do performDial(); times+; while(balance=0); balance = current; return times-1; class PhoneCard200 extends PhoneCard static long nextCardNumber; static final String connectNumber = 200; static double additoryFee; long cardNumber; int password; boolean connected; static nextCardNumber = 2001800001; additoryFee = 0.1; PhoneCard200(double ib) cardNumber=nextCardNumber+; balance=ib; void performDial() balance -=0.5+additoryFee; class IC_Card extends PhoneCard IC_Card(double ib) balance=ib; void performDial() balance-=0.9; 运行结果如下:例2共定义了4个类,除了主类之外还有抽象类PhoneCard和它的两个子类PhoneCard200和IC_Card。3.2静态方法用static修饰符修饰的方法,是属于整个类的类方法;而不用static修饰符限定的方法,是属于某个具体类对象或实例的方法(可称之为对象方法)。声明一个方法为static至少有三重含义:(1) 调用这个方法,应该使用类名做前缀,而不是某一个具体的对象名。(2) 非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有。(3) 由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员的变量,而只能处理属于整个类的成员变量,也即,static方法只能处理static域。例如,在PhoneCard200中如果需要修改附加费,可以定义一个静态方法:setAdditory();static void setAdditory (double newAdd) if(newAdd0) additoryFee=newAdd; /additoryFee为静态域以往的例子中多次使用的main方法就是静态方法,这是为了系统在没有任何实例化对象之前就可以运行一个应用程序。在类定义中,凡涉及针对一个具体对象的方法必须是非静态的,调用方法时要采用“对象名.方法名”;而不涉及到具体对象的方法必须是静态的,调用方法时应采用“类名.方法名”。下面通过例3说明静态方法、静态域以及对象方法的使用。例3:TestStatic.javapublic class TestStatic public static void main(String args) Integer I = new Integer(25); System.out.println(Value()*2);/输出:50 System.out.println(i.floatValue();/输出:25.0 System.out.println(i=+i.toString);/输出:i=25 System.out.println(Integer.parseInt(100)*2);/输出:200 System.out.println(“100*2=”+Integer.toString(100*2);/输出:100*2=200 System.out.println(Integer.ValueOf(100).intValue()*2);/输出:200 System.out.println(Integer.MAX_VALUE);/输出:2147483647 System.out.println(Integer.MIN_VALUE);/输出:-2147483648 3.3其他方法3.3.1最终方法 在类定义中,凡是final修饰符所修饰的方法,是功能和内部语句不能被更改的最终方法,即是不能被当前类的子类重新定义的方法。如果类的某个方法被final修饰符所限定,则该类的子类就不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。这样,就固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。 需要注意的是:所有已被private修饰符限定为私有的方法,以及所有包含在final类中的方法,都被默认地认为是最终方法。因为这些方法要么不可能被子类所继承,要么根本没有子类,所有都不可能被重载,自然都是最终方法。3.3.2本地方法native修饰符一般用来声明其他语言书写方法体并具体实现方法功能的特殊方法,这里的其他语言包括C、C+、FORTRAN和汇编等。由于native的方法的方法体使用其他语言在程序外部写成,所以所有的native方法都没有方法体,而用一个分号代替。4、 访问控制符访问控制符是一组限定类、属性或方法是否可以被程序中的其他部分访问和调用的修饰符,这里的其他部分是指程序里这个类之外的其他类。无论修饰符如何定义,一个类总能够访问和调用它自己的域或方法,但是这个类之外的其他部分能否访问这个域或方法,就要看该域和方法以及它所属的类的访问控制符如何定义了。Java中类的访问控制符只有一个:public,即公共的。一个类被声明为公共类,表明它可以被所有的其他类访问和引用,这里的访问和引用是指这个类作为整体是课件和可用的,程序的其他部分可以创建这个类的对象、访问这个类内部可见的成员变量和调用它的可见的方法。假如一个类没有访问控制符public说明,它就具有默认地访问控制特性。这种默认的访问控制权规定该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性又称为访问性。Java的类是通过包的概念来组织的,包是类的一种松散的集合。处于同一个包中的类可以不需要任何说明(默认情况)而方便地互相访问和引用,因为把常在一起协同工作的类放在一个包里也是很自然的。而对于在不同包中的类,一般说来,它们相互之间是不可见的,当然也不可能互相引用。但是,当一个类被声明为public时,它就具有了被其他包中的类访问的可能性,只要这些其他包中的类在程序中使用import语句引入这种public类,就可以访问和引用。下表说明了类的访问控制符如何对类的访问进行限定。表1类的访问控制符与类的访问控制默认(无访问控制符)公共类(有public修饰符)同一包中的类可以访问可以访问不同包中的类不可访问可以访问合理地利用类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生的类间干扰和错误。类成员就是指类的域和方法。一个类作为整体对程序的其他部分可见,并不能代表类内的所有域和方法也同时对程序的其他部分可见,前者只是后者的必要条件,类的域和方法能否为所有其他类所访问,还要看这些域和方法自己的访问控制符是如何定义的。表2类成员的访问控制符及其作用公共类(public)默认类类成员访问控制符publicprotected默认privatepublicprotected默认private可以访问类成员的区域AB+CBDBBBD访问控制符通常的定义方式是:(1) 类和类成员都采用默认访问控制(包内访问)。(2) 类比成员的访问范围宽。成员在类的范围内,根据各自的用途设置不同的访问控制。如果一个类定义了常用的操作,希望能作为公共工具供其他的类和程序使用,则应该把类本身和这些方法都定义成public,最典型的例子莫过于Java类库中那些公共类和它们的公共方法了。另外,每个Java程序的主类都必须是public类,也是基于相同的原因。由于用public修饰的域对外完全公开,可能会造成安全性和数据封装性下降,所以一般应减少public域的使用。为了使对象具有良好的封装性,一般将类的实例域设计成私有。为了使其他类或对象能够访问私有域,本类必须访问私有域的方法(公共方法)。而且按照惯例,读私有域的方法取名为get写私有域的方法取名为set。下面通过一个例子说明:例4:AccessControl.javaimport java.applet.Applet;import java.awt.*;public class AccessControl extends Applet ClassBeAccessed c=new ClassBeAccessed(); subClass sc=new subClass(); PackageClass ic=new PackageClass(); public void paint(Graphics g) g.drawString(self Accessible:,10,20); g.drawString(c.toString(),20,35); g.drawString(sub Accessible:,10,55); g.drawString(sc.AccessDirectly(),20,70); g.drawString(Package Accessible:,10,90); g.drawString(ic.AccessDirectly(),20,105); g.drawString(Access using public method:,10,125); g.drawString(sc.AccessCls(),20,140); g.drawString(ic.AccessCls(),20,155); class ClassBeAccessed public String m_PublicProperty; String m_FriendlyProperty; protected String m_ProtectedProperty; private String m_PrivateProperty; ClassBeAccessed() m_PublicProperty=new String(Publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年烈士纪念场所管理职位面试题库与答案解析
- 2025年工程监理中级考试指南与模拟题解析
- 2025年华能集团校园招聘攻略笔试模拟题及详尽解析
- 2025年机械工程专家面试模拟题与答案解析
- 2025年大数据分析师面试必-备知识要点与预测题
- 2025年注册会计师考试CPA备考攻略与模拟题
- 2025年初级网络安全工程师认证模拟题集及答案详解
- 2025年电子信息技术工程师专业技能考核试题集
- 制作虚拟现实教学课件
- 2025年电气设备安装与调试中级考试指南
- 车位包销合同协议书范本
- 教师名师笔试试题及答案
- 中考满分作文10篇(精读细研)
- 工业炉砌筑工程质量验收标准
- 中考数学模拟试卷及答案 (八)
- 2025年小学时事知识试题及答案
- 2024重庆对外建设(集团)有限公司招聘10人笔试参考题库附带答案详解
- 营销策划 -【汽车】上汽大众虚拟数字人整合营销方案
- 现代人常见健康问题与预防策略
- 残疾人孕妇日常护理
- 专项资金申请报告范文
评论
0/150
提交评论