java入门第11章修饰符qualifier_第1页
java入门第11章修饰符qualifier_第2页
java入门第11章修饰符qualifier_第3页
java入门第11章修饰符qualifier_第4页
java入门第11章修饰符qualifier_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

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

文档简介

第11章修饰符(Qualifier)Java中的类的概念,类源代码的存放类的变量类中的方法方法中的局部变量Java中的包类的继承11.1插曲:类的组成部分的名字1从所属关系的角度出发非静态变量:也称作成员变量。静态变量:也称作静态成员变量。非静态方法:也称作成员方法。静态方法:也称作静态成员方法。2从作用范围的角度出发非静态变量:也称作实例变量。静态变量:也称作类变量。非静态方法:也称作实例方法。静态方法:也称作类方法。11.2类中的修饰符类的主体是类中的代码。但是类中的修饰符对类也有着重要的意义。在前面的几章中,我们零零散散的解除了一些类的修饰符,本节中我们集中学习一下类的修饰符。类中可以用到的修饰符有很多,分别影响着类的可见性,类的可继承性等等。本章之前我们学习的类的修饰符只有public。11.2.1无修饰符类一个Java源文件中至少包含一个使用public修饰的、类名与源文件相同的类。源文件中可以包含0到多个没有使用public修饰的类,这些类的类名没有特殊的语法限制,可以使用任何合法修饰符。当一个源文件中包含多个类的时候,import语句部分引入的类应该涵盖了源文件中所有类所需要引入的类。11.2.2类的可见性类的可见性就是一个类在某些场景下是否可以被使用的性质。所谓的使用一个类包含了我们对类的各种操作——创建类的引用,创建类的对象,通过类名调用静态方法,继承这个类等等。当一个类是可见的,那么上面列出的这些操作都是允许的。类的可见性分为三种。同个包中的类:一个类是否可以被同个包中的类使用不同包中的类:一个类是否可以被不再同一个包中的类使用同一个源文件中的类:一个类是否可以被在同一个源文件中不同的类使用类的访问控制符对同个源文件中的类可见对同个包中的类可见对不同包中的类可见public√√√默认修饰符√√×11.2.3final——让类不可被继承上一章中我们学习了继承。如果想要一个类不能够被继承,可以使用final关键字修饰这个类。使用final关键字修饰一个类,代表这个类不可以被继承final关键字要放在类的访问控制符的后面,放在class关键字的前面。11.2.4理解final关键字我们之前接触过final关键字,当时我们是使用final关键字修饰变量,代表这个变量的值不可改变。同样的,当我们用final关键字修饰一个类的时候,也从某种程度上代表“类是不可变的”。联系我们前面学习过的“覆盖”,如果一个类被继承了,那么其方法就有可能会被子类覆盖。而这时候,父类的行为就有可能被改变。对于普通的程序来讲,其实final关键字很少被使用。只有像Java类库这种被外部开发人员使用的类库中的类才会使用这种限制。从某种程度上说,用final修饰一个类和一个变量都代表它们“不可改变”——一个是行为不可改变,一个值不可改变。11.2.5总结:类的修饰符本节中我们学习了类的修饰符。回过头来我们发现其实这些修饰符只是带来了更多的限制,并没有给类带来更多直接的功能。其实修饰符很多情况下都是出于设计目的而使用的。我们看图11-2所示的现在的源文件的结构。11.3方法的修饰符与类的修饰符相比,方法的修饰符真可谓是丰富多彩。方法的修饰符在前面接触最多的就是public。本节中我们将学习可以用于方法的其它修饰符。public属于方法的访问控制符,用于限制方法的可见性,在前面的章节提到过,public会赋予方法最大的可访问权限。Java中还有其它的访问控制符,可以让方法的可见性灵活多变。同时,我们还将学习将static和final两个修饰符用于方法。这两个修饰符可以给方法赋予特殊的性质。好的,让我们开始本节的内容。11.3.1方法的访问控制符与类的访问控制符作用相同,方法的访问控制符也是用来控制一个方法是不是可见的。当然,方法的可见性是受制于类的可见性的,一个类没有使用public修饰(如上一节中的ClassTwo),对于别的包中的类(如上一节中的AnotherPackge类),这个类(ClassTwo类)中的方法无论使用什么修饰符修饰,对于它们(AnotherPackge类)来说都是不可用的。方法的访问控制符有四个。public:没有使用限制默认:只能被同一个包中的类使用protedted:只能被子类使用private:只能在本类中使用11.3.2public:没有限制的修饰符对于使用public修饰的方法,完全没有任何访问限制。这个我们在前面已经用了很多了。使用public修饰修饰的方法没有访问限制,对于本类、子类、同包的类以及不同包的类都是可见的。11.3.3protected:仅对子类和同包的类可见如果一个方法是使用protected修饰的,那么这个方法就只对其子类和与之在同一个包中的类可见。使用protected访问控制符修饰的方法对同个包中的类或其子类可见。11.3.4默认控制符:仅在本包中可见如果一个方法是的访问控制符是默认(也就是没有)的,那么这个方法只能够在同个包中使用。也就是本类中也包中的其它类中使用。Java之所以会有这么一个修饰符,是因为同一个包中的类经常在一起完成一个功能。而在完成这个功能的时候,有时候一些方法是不想被外部的包所调用的,这时候这些方法就可以使用默认的访问控制符修饰。使用默认控制符修饰的方法,只能够在本包中可见。如果子类与父类不在同一个包中,我们就可以认为这个子类没有继承父类中使用默认控制符修饰的方法。11.3.5private:仅对本类可见private修饰的方法可见性最小,它只能够在本类中访问。类AccessMethods中private的方法就只能够在类类AccessMethods中使用。使用private修饰的方法,只能够在本类中可见。父类中使用private修饰的方法对子类不可见,或者我们可以理解为子类没有继承父类中private的方法。11.3.6理解四个访问控制符四个访问控制符所表达的可见性从大到小依次为:public>protected>默认>private。Java中提供的四个访问控制符,主要用来从语法上避免编程的错误。11.3.7访问控制符可见性汇总好的,前面我们学习了四个访问控制符(默认也算一个),下面我们通过一个表格来把这四个访问控制符所代表的可见性通过表11-2总结一下。访问控制符对所在的类可见对同个包中的类可见对子类可见对不在同个包中的类可见public√√√√protected√√√×(1)默认√√×(2)×private√×××11.3.8访问控制符带来的覆盖问题在前面的小节中,我们知道如果父类的方法是使用默认访问修饰符或者private修饰的,那么方法对子类是不可见的。也就是说子类没有继承这些方法。这时候,如果子类中有与父类中这些方法签名相同的方法,也是无法构成覆盖的,因为这些方法对子类根本就是不可见的。覆盖的前提:父类中的方法对子类可见。11.3.9final:不允许方法被覆盖前面我们学习了方法的访问控制符,本节中我们学习可以用于方法的另一个修饰符——final。final关键字我们在前面已经接触过了。当用final来修饰类的时候,它表示这个类不能被继承;当用final来修饰变量的时候,它表示变量值不能改变。使用final关键字修饰方法的语法:访问控制符+final+返回值类型+方法名+参数列表+方法体。即final关键字一定要放在方法的访问控制符之后,返回值类型之前。使用final关键字修饰的方法不可以被子类覆盖。理解在编程中何时使用final关键字修饰方法。11.3.10重温静态方法使用static修饰的方法称作静态方法,又称作类方法。同样的,使用static修饰的变量又称作类变量或者静态变量。本小节中主要回顾前面学过的静态方法的性质。静态方法的语法如下。访问控制符+static+返回值类型+方法名字+方法参数+方法体当然,静态方法也可以使用final修饰,final和static都应该放在访问控制符和返回值类型之间,final和static谁先谁后都正确。静态方法有如下特点。应该通过类名直接调用,不用通过引用调用。方法内部代码只能够使用本方法内的局部变量、方法的参数、静态变量和静态方法。也就是不能使用非静态的变量和非静态的方法。同样,也不能够使用this关键字和super关键字来访问非静态方法或变量。11.3.11静态方法——类范围里的概念非静态方法和静态方法,最大的区别就是非静态方法可以访问类定义的实例变量。非静态方法是通过指向对象的引用调用的,所以非静态方法可以操作调用它的那个对象内部的实例变量;静态方法是通过类名调用的,它无法直接操作类中某一个对象的实例变量,所以它只能访问静态变量和静态方法。从“类方法”和“类变量”这两个名字理解静态方法和静态变量:它们都是属于类管理范围,与对象无关。11.3.12静态方法何以为“静态”静态方法何以成为“静态”呢?在Java中,与静态对立的就是动态,也就是我们前面重点讲解的“多态”。对于静态方法而言,是不存在动态的。具体来说,就是不存在覆盖。我们在编写程序的时候,其实就很明确哪个方法会被调用。对于普通的方法“Java会根据引用所指向的对象的类型来决定执行哪个方法,引用指向的对象是动态可变的”,所以给Java程序带来了多态;而对于静态方法,“Java会根据类名或者引用所属的类来决定调用哪个静态方法”。类名固然是不可随便改的,同样,引用的类型在引用创建出来后就不可改变了。所以,静态方法不存在多态的性质。11.4变量的修饰符上一节中学习了方法的修饰符。本小节中我们将进一步学习变量的修饰符。通过上一节的学习,本节的学习将变得相对轻松很多。变量的修饰符作用和用法与方法的十分类似。在本节的学习过程中,可以联系相同的修饰符在修饰方法和变量时的意义有何“相通之处”,通过对比加深记忆。11.4.1变量方法皆成员其实从类定义的组成部分来看,两者是“平级”的,都是类的成员:方法用来描述类(类的对象)的行为,变量用来表示类(类的对象)的属性。可以通过图11-4来表示类定义的组成。方法和变量(局部变量除外)都是类的组成部分,都是类的成员。成员变量指的是类中定义的变量(局部变量是在方法中定义的,不算);成员方法指一个类的所有方法。11.4.2变量的访问控制符既然方法和变量都是类的组成成员,那么也就同样有着“可见性”的问题。前面学过的四种访问控制符都可以用在变量上,而且其作用也是完全一样的。为了明确起见,通过下面的表格11-3来说明访问控制符对变量的作用。访问控制符对所在的类可见对同个包中的类可见对子类可见对不在同个包中的类可见public√√√√protected√√√×默认√√××private√×××11.4.3使用private修饰类的成员变量在前面的例程中,几乎都是在使用默认访问控制符或者public访问控制来修饰变量。这是出于让例程看上去简单一些,让我们的注意力集中在所要表达的语法重点上。本小节中,将讲解为什么应该尽量用private作为变量的访问控制符。为了避免类外部直接操作成员变量的值,在没有特殊需要的情况下,我们应该尽量使用private访问控制符修饰成员变量。11.4.4使用private,然后呢?在上一小节而中,我们介绍了允许在类外部修改成员变量值的潜在危险。同时我们知道,为了避免这种危险,应该尽量使用了private作为成员变量的修饰符。但是因为private的变量不允许在外部访问,我们就无法在类外部直接操作成员变量的值了。我们可以在类中添加几个方法来轻松弥补这个缺陷,看新的CarBase类如下。对于成员变量,我们应该:(1)尽量使用private修饰变量;(2)根据程序的需要提供getXXX和setXXX方法。(3)在getXXX和setXXX方法中检查变量的新的值,并根据结果做出相应操作。11.4.5变量的覆盖在本节开始说过,变量和方法皆成员。对于方法,有覆盖的概念。对于变量,其实同样也有覆盖的概念。变量的覆盖与方法的覆盖定义类似:如果子类从父类中继承了一个变量,而同时子类本身中也定义了一个类型与变量名相同的成员变量,那么子类的变量将覆盖父类的变量。在成员变量的覆盖中,引用属于哪个类,就会得到哪个类的对象的成员变量。这与引用指向的对象无关尽量不要使用变量的覆盖。11.4.6使用final修饰成员变量我们在前面已经讲述过使用fianl修饰成员变量的语法了,在这里再来重温一下。访问控制符+final+成员变量类型+成员变量名字+“=”+值;对于使用final修饰的成员变量,最大的两个特点如下。必须在创建变量时给变量赋值。变量的值以后不可再改变,即不可给final的成员变量再次赋值。11.4.7静态成员变量关于静态成员变量的语法内容,在这里总结如下。static可以用来修饰成员变量,这时的成员变量可以称作类成员变量(从其说属的范围来看)或静态成员变量。一个静态变量对于一个类来说只有一份。对于SimpleCar类,静态变量MAX_SPEED只有一份。无论在什么地方使用SimpleCar.MAX_SPEED来访问这个静态变量,所操作的都是同一个变量的。静态成员变量可以通过类名直接操作。静态成员变量可以在静态方法中使用。因为静态变量的唯一性,我们可以使用静态变量来在对象中访问同一个值。只要一个类是可见的,而且这个静态变量也是可见的(根据静态变量的访问控制符),那么就可以使用这个类中的静态变量。不要错误的以为一个类的静态变量仅仅可以在本类中或者本类的对象中使用。11.4.8局部变量的修饰符前面讲的都是用于成员变量的修饰符。对于局部变量(方法中的创建的变量)来说,只有一个修饰符可以使用——final。使用final修饰局部变量的语法如下。final+局部变量类型+局部变量名字=值;使用final修饰局部变量,

温馨提示

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

评论

0/150

提交评论