JAVA主要修饰符的应用.doc_第1页
JAVA主要修饰符的应用.doc_第2页
JAVA主要修饰符的应用.doc_第3页
JAVA主要修饰符的应用.doc_第4页
JAVA主要修饰符的应用.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA主要修饰符的应用 武汉理工大学 软件工程1002班 戴振杰JAVA程序在定义类时,除了使用class关键字标识之外,还可以在class关键字标识之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类,有些类的修饰符也可以用来修饰类中的域或方法。一、访问修饰符访问控制符是一组限定类、域或方法是否可以被程序里的其他部分访问和调用的修饰符。类的访问控制符只有一个public,域和方法的访问控制符有四个,分别是public、private、protected、private protected,另外还有一种没有定义专门的访问控制符的缺省情况。1.公有访问控制符public:Java的类是通过包的概念来组织的,包氏类的一个松散的集合。处于同一个包中的类可以不需要任何说明而方便的互相访问和引用,而对于不同包中的类,则不行。但当一个类被声明为public时,他就具有了被其他包中的类访问的可能性,只要这些其他包中的类在程序中使用import语句引入public类,就可以访问和引用这个类。类中被设定为public的方法是这个类对外的接口部分,避免了程序的其他部分直接去操作类内的数据,这实际就是数据封装思想的体现。public是公共的,外部代码跟子类都可以访问。此时,public对于外部代码跟子类的作用是一样的。每个Java程序的主类都必须是public类,也是基于相同的原因。用public修饰的类的域称为公共域。如果公共域属于公共类,则它能被所有的其他类所引用。而public修饰符也存在缺点,在于public修饰符会造成安全性的数据封装性下降,所以一般应减少public域的使用。2.缺省访问控制符:缺省访问控制权规定,该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性又称为包访问性。同样道理,类内的域或方法如果美育访问控制符来限定,也就具有包访问性。简单说,定义在同一个程序中的所有类属于一个包。3.私有访问控制符private :用private修饰的域或方法只能被这个类自身所修改,而且不能被任何其他类来获取和引用。private变量或者函数可以被子类对象所继承,却不可被直接访问,但可以通过访问子类其他非private成员函数获取继承的private。private修饰符用来声明那些类的私有成员,它提供了最高的保护级别。4.保护访问控制符protected :用protected修饰的成员变量可以被三种类所引用:该类自身、与它在同一个包中的其它类、在其他包中的该类的子类。使用protected修饰符的主要作用是允许其他包中该类的子类来访问父类的特定属性。5.私有保护访问控制符 private protected :用private protected修饰的成员变量可以被两种类访问和引用,一种是该类本身,一种是该类的所有子类。把同一个包内的非子类排除在可访问的范围之外,使得成员变量更专于具有明确继承关系的类,而不是松散地组合在一起的包。另:内部类的修饰字还可以是private:即只有外层类的区域可以访问。二、非访问修饰符。1.抽象类:凡是用abstract修饰符修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。抽象类是一种经过优化的概念组织方式:把共同特点抽象出来;其后在描述和处理某一种具体对象时,就只需描述不同的特殊之处。这种组织方式使得所有的概念层次分明,简洁洗练,非常符合人们日常的思维习惯。由于抽象类是它的所有子类的公共属性的集合,所以使用抽象类的一个优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。值得一提的是,面向对象技术是要用更接近于人类思维方式的方法来处理实际问题,抽象类的设立就是这种思想的具体体现之一,它是模仿人类的思维模式的产物。2.最终类:final所标记的成分具有终态的特征,表示最终的意思Java中final修饰符既可以修饰类、方法,也可以修饰变量用final修饰的类不能被继承用final修饰的方法不可重写用final修饰的变量最多只能赋值一次 值不可变3.有些类的修饰符也可以用来修饰类中的域或方法:(1) 域:是类和对象的静态属性,定义域的操作就是说明变量或创建对象的操作。 静态域用static修饰符修饰的域是仅属于类的静态域。静态域是类中每个对象共享的域。他们是类的域,不属于任何一个类的具体对象。是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值。用static修饰成员时,如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。 静态初始化器静态初始化器是由关键字static引导的一对大括号括起的语句组。作用是:在加载时,初始化类的静态域。如有多个static程序段,则在类的初始化时,会依次执行.与构造函数相同,他们都是用来完成初始化的工作,但是静态初始化器与构造函数有三点不同:构造函数是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载到内存时由系统调用执行。不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。 最终域用final修饰的域,实际上就是Java中的常量。用final修饰符说明常量时,需要注意以下几点:需要说明常量的数据类型。需要同时指出常量的具体取值。因为所有类对象的常量成员,其数值都固定一致,为了节省空间,常量通常声明为static。下面,主要介绍一下public修饰符、protected修饰符、private修饰符、static修饰符、final修饰符、abstract修饰符的使用。public修饰符:使用对象:类、接口、成员。可以被任何类访问。Java的类是通过包的概念来组织的,包是类的一个松散的集合。处于同一个包中的类可以不需要任何说明而方便的互相访问和引用,而对于不同包中的类,则不行。但当一个类被声明为public时,他就就有了被其他包中的类访问的可能性,只要这些其他包中的类在程序中使用import语句引入public类,就可以访问和引用这个类。类中被设定为public的方法是这个类对外的接口部分,避免了程序的其它部分直接去操作类内的数据,这实际就是数据封装思想的体现。用public修饰的类的域称为公共域。如果公共域属于公共类,则它能被所有的其他类所引用。Public修饰符会造成安全性的数据封装性的下降,所以一般应减少public域的使用。例子如下:package test;/import B;/import C;/import Testpublic;public class Testpublic public int x = 1; public int y = 10; public void showX() System.out.println(From A, x= + x); public void showY() System.out.println(From A, y= + y); public static void main(String args)/System.out.println(From B,y= + ); new Testpublic().showX(); new Testpublic().showY(); new B().showX(); new B().showY(); new C().showX(); new C().showY();class B extends Testpublicpublic void showX()System.out.println(From B, x= + x);public void showY() /重定义类方法showYSystem.out.println(From B, y= + y);/new Testprotected().showY();class Cpublic int x=new Testpublic().x;public int y=new Testpublic().y;public void showX()System.out.println(From C, x= + x); public void showY() System.out.println(From C, y= + y); 运行结果如下:protected修饰符:使用对象:成员用protected修饰的成员变量可以被同一包中的所有类访问、可以被所有子类访问、子类没有在同一包中也可以访问。使用protected修饰符的主要作用是允许其他包中该类的子类来访问父类的。例子如下:public class Testprotected protected int x = 1; protected int y = 1; protected void showX() System.out.println(From A, x= + x); protected void showY() System.out.println(From A, y= + y); public static void main(String args)/System.out.println(From B,y= + ); new Testprotected().showX(); new Testprotected().showY(); new B().showY(); class B extends Testprotectedprotected void showY() /重定义类方法showYSystem.out.println(From B, y= + y);/private static int y = 2;/new Testprotected().showY();运行结果如下:private修饰符:使用对象:成员。用private修饰的域或方法只能被该类本身所访问和修改,而且不能被任何其他类(包括该类的子类)来获取和应用。Private修饰符用来声明那些类的私有成员,它提供了最高级别的保护。例如,程序如下:public class Test private int money; Test() money=500; System.out.println(private money=+money); private int getMoney() return money; public static void main(String args) Test t=new Test(); t.money=1000; /合法 int m=t.getMoney(); /合法 System.out.println(money=+m); 运行结果如下:abstract修饰符使用对象:类、接口、方法用 abstract 修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化,即不允许创建抽象类本身的实例。没有用 abstract 修饰的类称为具体类,具体类可以被实例化。 用 abstract 修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用 abstract 修饰的方法称为具体方法,具体方法具有方法体。 abstract 语法规则: 抽象类可以没有抽象方法,但包括了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类。Abstract 修饰符: 抽象类不能被实例化。 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。 如果子类没有实现父类中的抽象方法,子类必须定义为抽象类。 抽象类不能被定义为private、final和static类型。 没有抽象构造方法。 抽象方法没有方法体。 例如,程序如下:public class TestOverLoad public static void main(String args)D200_Card my200 = new D200_Card();my200.balance=50.0;System.out.println(子类自己的余额:+my200.getBalance();if(my200.performDial()System.out.println(子类的剩余余额为:+my200.balance);abstract class PhoneCarddouble balance;abstract boolean performDial();double getBalance()return balance;abstract class Number_PhoneCard extends PhoneCardlong cardNumber;int password;String connectNumber;boolean connected;boolean performConnecting(long cn,int pw)if(cn=cardNumber&pw=password)connected=true;return true;elsereturn false;class D200_Card extends Number_PhoneCarddouble additoryFee;double balance;boolean performDial()if(balance(0.5+additoryFee)balance-=(0.5+additoryFee);return true;elsereturn false;double getBalance()return balance;运行结果如下:static修饰符使用对象:类、方法、字段、初始化函数通常,在创建类的实例时,每个实例都会创建自己实例变量。但是在变量的声明中可以使用Static修饰符,它表明该成员变量属于类本身,独立于类产生的任何对象。这种成员变量称为静态变量(静态属性)。方法的声明中也可以使用static修饰符,表明该方法从属于类本身。 在静态成员函数中只能直接调用其它的静态成员函数或引用静态属性,否则会造成编译错误。静态成员函数中也不能使用this或者super,因为它们是和类的对象相关联的。 静态属性和静态方法不需要创建实例就可以使用。 典型的例子是java.lang包中的System类中的方法和变量。我们常用 System.out.println(“message”); 输出信息,并没有创建System的实例,是因为println方法声明为System类的静态方法,它不需创建实例就可以使用。当类被加载时,静态代码块只被加载一次。类中不同的静态代码块按它们在类中出现的顺序依次执行。static修饰符 静态变量在内存中只有一个拷贝,在类的所有实例中共享。 在静态方法中不能直接访问实例方法和实例变量。 在静态方法中不能使用this和super关键字。 静态方法不能被abstract修饰。 静态方法和静态变量都可以通过类名直接访问。 下面的例子会帮助你更深刻的理解Static修饰符。注意各个代码块的加载次序。 public class Sample static int s1=3; static int s2; static void display() System.out.println(s1=+s1); System.out.println(s2=+s2); static System.out.println(static block); s2=s1+1; public static void main(String args) Sample.display(); 一旦这个类被调用,所有的静态变量都被初始化,s1被赋为3,然后运行static块,这将打印出一段消息,并且把s2赋为s1+1,即4。然后解释器调用main成员函数,它调用了成员函数display,该函数输出s1和s2的信息。运行结果如下: 通过上面的例子还可以看出,一个静态成员函数可以通过它所属的类名来调用。final修饰符使用对象:类、方法、字段、变量final修饰符 用final修饰的类不能被继承。 用final修饰的方法不能被子类方法覆盖。 private类型的方法默认为是final方法,因而不能被子类的方法覆盖。 final变量必须是显示初始化,并且只能被赋一次值。如果一个类是完全实现的,并且不再需要继承子类,则它可以声明为Final类。如果final类的名字出现在另一个类声明的extends字句的后面就会产生编译错误。这表明final类不能有任何的子类。类不能同时被声明为abstract和final,因为abstract类中的abstract方法永远没有机会被实现。 在缺省情况下,所有的成员函数和实例变量都可以被覆盖。如果你希望你的变量或成员函数不再被子类覆盖,可以把它们声明为final。例如:final int MAX_VALUE = 100; 表示,MAX_VALUE的值为100,并且不能再更改。final变量用大写标识符是一个一般的约定。每个使用了final类型变量的地方都不会通过连接而进行访问。比如说IncludeFinal类中使用了Data类中final的int数字staticVar和instanceVar,这时候,java编译器会将其所赋值编译到类的指令码或者常量池中。这样,每次类用到staticVar和instanceVar的时候,不会通过引用连接到Data类中进行读取,而是直接使用自己保存在类文件中的副本。用程序说话:interface IncludeFinalInterface /接口中定义的变量都是public static final的 int staticVar = 0; /作为接口成员的变量,其赋值只能在声明中完成class IncludeFinal static final int staticVar; final int instanceVar; IncludeFinal() instanceVar = 10; /实例变量的赋值还可以在构造器中进行 IncludeFinal(final boolean sameAsStatic) instanceVar = sameAsStatic ? staticVar : 10;/ sameAsStatic = false;/不能编译,final修饰的构造器参数变量在构造器体中不能被再次赋

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论