3.2访问控制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

3.2访问控制包(package)利用面向对象技术开发系统时,通常需要定义许多类共同工作,为了更好地管理这些类,JAVA中引入了包的概念。像文件夹把各种文件组织在一起一样,JAVA中的包把各种类组织在一起,使得程序功能清楚,结构更分明。由于同一包中的类在缺省情况下可以互相访问,通常把需要在一起工作的类放在一个包里。包(package)包中定义的类必须通过包名访问,这样,尽管同一包中的类不能同名,但不同包中可以有同名的类。包还参与了Java的访问控制机制。类的成员可以声明为包私有的,使得包中的其它类能够访问,而包外的代码无法访问。这样,包在类的外层定义了另一种封装的实现形式。利用包来管理类,可实现类的共享与复用(类库)。包与目录一个包可以包含若干个类文件,还可包含若干包。形成嵌套的层次结构的包,嵌套时包名之间用小数点.分隔。包名一般全小写(类名第一个字母大写)。层次结构的包必须创建层次结构的目录。包a.b.c对应目录…\a\b\c。包名本身对应一个目录(用一个目录表示)。定义包Java所有的类都属于某个包。如果定义类的时候没有指定包,就放置在默认包中,默认包没有名字。可以在类定义的顶部使用package语句指定类所属的包。package语句的格式为:package包名;Eclipse里创建包菜单:FileNewPackage,创建新的包或新建类的时候,指定并创建新的包。导入类使用同一个包中的其他类,可直接使用。使用其他包中的类,可有两种方式:在引用类之前冠以包名作前缀(麻烦)java.util.Datetoday=newjava.util.Date();用import语句将此包中的某些或所有类导入当前程序:(更常用)import语句import语句将指定包中的类引入当前的程序中,即告诉编译到哪去找程序中使用的类。import语句必须出现在所有类定义之前,package语句之后。例:importjava.util.*;该语句引入整个utility类库(标准Java库的一部分)例:importjava.util.Vector;该语句只引入Vector类,utility类库中的其他类不可用。导入整个包会存在两个弊端:导入整个包时,JVM会保存包中所有元素的名字,这必然会使用额外的RAM来存贮这些类和方法名,对于内存很小的小型设备就会降低性能;最大的弊端是涉及到Internet的带宽。当导入不在本地计算机上的整个包时,浏览器不得不等到整个包中所有类都从网上下载过来之后才能工作,浪费资源。不能直接导入默认包中的类,要导入默认包的类,需先将其放入某个有名称的包中!例:定义和访问指定包中的类问题:定义一个表示书本的类Book,放在名为pack1的包中。在默认包中定义类Example4_11,访问类Book。分析:Book在pack1包中,因此,类Book的定义中必须有package语句。类Example4_11在默认包中,不需要package语句,但Example4_11访问类Book,因此必须使用import导入Book。程序源代码://Book.javapackagepack1;publicclassBook{Stringtitle;doubleprice;publicBook(Stringt,doublep){title=t;price=p;}publicvoidshow(){System.out.println(title);System.out.println(price);}}//Example4_11.javaimportpack1.Book;//导入pack1包中的类BookpublicclassExample4_11{publicstaticvoidmain(String[]args){Bookb=newBook(JavaGuide,23.5);b.show();}}程序运行结果:JavaGuide23.5访问权限类成员的权限修饰符:Java类成员有三个访问权限修饰符,用于设置类成员的不同访问权限,分别为public、protected和private,没有这些修饰符时,成员使用默认的访问控制权限。类的权限修饰符:以上三个修饰符中,只有public可以用来修饰类。类的访问权限定义类时,可以不使用权限修饰符,也可以用public将类设置成公有的,类不能用另外两个权限修饰符。使用public修饰的公有类对所有类都是可见的,既可以被同一个包中的类访问,也可以被其它包中的类访问(注意其他包访问公有类时,要用import导入)。不用public修饰符的类仅仅在包内具有可见性,即只能被同一个包中的类访问,不能被其它包中的类访问。类成员的访问权限与修饰类时一样:用public修饰的成员对所有类(包内和包外)都可见,无修饰符的成员仅仅在包内具有可见性。private修饰的私有成员仅仅在类的内部具有可见性,不能被类以外的代码访问。protected修饰的成员在包内具有可见性,在其它包中,只能被该类的子类继承。类成员的访问权限修饰符类内包内其它包的子类内所有类private是否否否无是是否否protected是是是(注意:在不同包中,只能在子类内访问,不能在子类外访问)否public是是是是示例:访问权限-1packagetest;publicclassDemo1{privateintpriInt;protectedintproInt;intdefInt;publicintpubInt;voidtest(){priInt=1;proInt=1;defInt=1;pubInt=1;}}在这个例子中,同一个类内可以访问任何访问权限的变量。示例:访问权限-2packagetest;publicclassDemo2{voidtest(){Demo1dm1=newDemo1();dm1.priInt=1;//错误dm1.proInt=1;dm1.defInt=1;dm1.pubInt=1;}}Demo2和Demo1在同一个包下,但Demo2对Demo1中的private成员没有访问权限。示例:访问权限-3packagetest;publicclassDemo3extendsDemo1{voidtest(){this.priInt=1;//错误this.proInt=1;this.defInt=1;this.pubInt=1;}}Demo3是Demo1的子类,而且在同一个包下,Demo3也没有对Demo1中的private成员没有访问权限。示例:访问权限-4packagetest.t1;importtest.Demo1;publicclassDemo4{voidtest(){Demo1dm1=newDemo1();dm1.priInt=1;//错误dm1.proInt=1;//错误dm1.defInt=1;//错误dm1.pubInt=1;}}Demo4是和Demo1在不同包下,且不是Demo1的子类,因此Demo4只能访问Demo1中的public成员。示例:访问权限-5packagetest.t1;importtest.Demo1;publicclassDemo5extendsDemo1{voidtest(){//this.priInt=1;//错误this.proInt=1;//this.defInt=1;//错误this.pubInt=1;}}Demo5是Demo1在不同包下的子类,因此与Demo4不同,它除了拥有对Demo1中的public成员有访问权限外,还拥有对Demo1的protected成员有访问权限。方法中不同变量的作用域成员方法的定义中,方法体内的代码中可以出现下列变量:类的成员变量,即域变量。形式参数列表中的变量,称为参变量。方法内部声明的变量,称为局部变量。其中,成员变量在类中定义,可以被同一个类的所有成员方法访问。参变量的作用域是这个变量所在的方法,在这个方法外,参变量不可见。局部变量的作用域是定义局部变量的语句块,语句块外,局部变量不可见。方法中不同变量的作用域当参变量和类成员变量同名时,参变量的作用域优先可见,要想使用类成员变量,需要加this关键字。//如自动生成setters和getters作业定义一个类表示学生,要求如下:成员变量分别为String型的姓名、String型的学号、int型的年龄、MyDate型的入学日期,(MyDate类的成员变量包括年、月、日)为各类设置适当的成员方法。练习在学生类中对MyDate类的调用。体会不同的访问权限。static修饰符定义类时,有时候希望成员变量(或方法)与任何对象无关。使用关键字static在变量或方法之前,可表明它们与对象无关,是属于类的,使用static修饰的成员变量称为类变量或静态变量,没有使用static修饰的成员变量称为实例变量。使用static修饰的成员方法称为类方法或静态方法,没有使用static修饰的成员方法称为实例方法。实例变量与类变量对于实例变量,每个对象都有内存保存各自的实例变量,但对于类变量,是所有对象共享同一个类变量。classTestStatic{chardata;staticintshare_data;}classDemo{TestStatica,b,c,d;}objectachardataobjectcchardataObjectbchardatastaticintshare_dataobjectdchardata实例变量与类变量类变量最本质的特点就是它是属于类的,而不归任何一个类的实例(对象)所有,任何一个类的实例操作这个成员,都是对同一个类变量的操作。类变量的生存期不依赖于对象,可以不用通过创建该类的实例,直接通过类名访问它们。但在类外访问实例变量时,只能通过创建的实例对象访问它们。实例变量遵循对象的生命周期,随着对象的创建而创建,随着对象的消亡而消亡。示例:实例变量与类变量classVehicle5{staticintpassengers;//定义类变量doubleweight;}publicclassExample4_9{publicstaticvoidmain(String[]args){Vehicle5v1=newVehicle5();Vehicle5v2=newVehicle5();v1.passengers=2;//给类变量赋值v1.weight=5.5;System.out.println(v1成员变量值:+v1.passengers++v1.weight);System.out.println(v2成员变量值:+v2.passengers++v2.weight);示例:实例变量与类变量v2.passengers=6;//给类变量重新赋值v2.weight=11.1;System.out.println(v1成员变量值:+v1.passengers++v1.weight);System.out.println(v2成员变量值:+v2.passengers++v2.weight);//使用类名引用类变量System.out.println(passengers的值:+Vehicle5.passengers);}}程序运行结果:v1成员变量值:25.5v2成员变量值:20.0v1成员变量值:65.5v2成员变量值:611.1passengers的值:6实例方法和类方法类方法定义格式如下:(加static修饰符)static返回值类型方法名(参数列表){//方法体}实例方法和类方法类方法与实例方法的不同表现在:调用类方法时不需要创建对象,可以由类名直接调用,也可以创建对象后由对象的引用变量调用,而实例方法只能通过后一方式调用,不能由类名直接调用。类方法中只能访问(static的)类变量、类方法,而实例方法中既可以访问实例变量和实例方法,也可以访问类变量和类方法。类方法中不能使

1 / 36
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功