包和接口

1.包:在编程中,把相关程序段组织起来经常是很有益的,Java中通过包来实现;
  a.包服务于两个目的:首先它提供了把相关程序段组织成一个单元的机制,在包中定义的类必须通过它们的包名来访问,所以,包就提供了一种命名类的集合的途径;其次包还参与了Java的访问控制,包中定义的类可以声明为包所私有的,使包外的代码无法访问,这样包就为类提供了一种能够被封装的方式。
  b.要想创建一个包,应该在Java源文件的顶部放置package命令,那么该文件中声明的类就会属于指定的包,package语句格式为package pkg;
  c.Java使用文件系统来管理包,每一个包都保存在自己的目录中;包名字是区分大小写的,这就意味着存储包的目录的名字必须和包的名字完全一致。
  d.可以创建一个层次结构的包,这样做只需使用逗号把每一个包和位于其上的包区分开来即可,如package pack1.pack2.pack3...packN;当然必须创建相应的目录来支持所创建的包结构,如package X.Y.Z;必须存储在.../X/Y/Z中,其中...指明了一个通向特定包的路径。
  e.寻找包和classpath:Java运行时,系统是这样寻找所创建的包的:首先在默认时,Java运行时系统使用当前运行的目录作为它的起点,如果类文件在当前目录中,或当前目录的子目录中,包就会找到;其次,可以通过设定CLASSPATH环境变量来指定一个或者多个目录路径;第二种方法可以使程序不管在什么目录中都能找到包;值得注意的是为避免混淆,最好把所有与包有关的.java和.class文件都放在各自的包目录中,这样就可以在该包上方的目录中使用java 包名.类名 来执行程序,但不能用java 类名 的形式运行程序。
  f.包和成员访问:元素的可见性取决于它的访问说明和元素所在的包的性质;如果一个类的某一成员没有显式的访问指示符,那么在包的内部元素使用默认的访问说明,在包内是公有的,而对其他包是私有的;显式声明为public的成员始终是可见,其使用和访问不受限制;私有成员仅仅对于其所属类的其他成员是可以访问的,私有成员不受所在包的成员关系的影响;protected成员对于其所在包和其全部子类(包括其他包中的子类)都是可访问的。
  g.如果位于一个包中的成员要访问位于另一个包中的类,则除了该类必须及其成员必须声明为公有的外,还必须使用import语句,或者必须完全限定它的名字,以便包含其完整的包说明,如BookPack.Book books[]=new BookPack.Book[5];这样的语句使用包名BookPack限定Book,而且每次使用Book时要在前面加上BookPack的限定符。
  h.C++和Java中protected访问指示符类似,但不相同,在C++中,protected创建的成员可以由子类访问,但对非子类是私有的,但在Java中,protected创建的成员可以由包中的任何代码访问(包括子类和其他非子类),但在包外就只能由子类访问。
  i.导入包:从另一个包中使用类时,使类名和包的名字完全匹配,但当类深埋在包的层次结构中时,就会很麻烦,为此Java有更方便的使用类的方法:import语句;使用import语句可以访问包中的一个或者多个成员,而且能够直接使用这些成员,而不必显式的限定包;import语句形式为import pkg.classname;其中pkg是包的名字,可包含它的完整路径,classname是被导入的类的名字,若要导入包的全部内容,可使用*好代替类名,如import MyPack.MyClass或import MyPack.*;在Java源文件中,import语句紧跟package语句(如果存在的话)出现,并且位于任何类定义之前;Java定义了所有程序都可以使用的大量标准类称为Java API,Java API存放在包中,包层次的顶部是java,java.lang是惟一的一个会自动的导入到每一个java程序中的类,其他的包都需要程序员显式的导入。
2.接口:在Java中,为了将一个类的接口和实现方法完全分开,将抽象类和方法进一步扩展,定义了关键词interface实现该功能;
  a.在语法上,接口类似于抽象类,但在接口里方法不包含实体,即接口什么实现方式也不提供,它仅指定必须做什么,但是不说明如何做;一旦接口被定义,任意数量的类都可以实现它,且一个类可以实现任意数量的接口。
  b.为实现接口,类必须为接口描述的方法提供实体(实现方式),每个类自由决定其实现方式的细节,这样两个类可以以不同的方式实现同一个接口,但每一个类仍旧支持同样一套方法,故识别接口的代码可以利用这两个类的对象,接口的一般形式:
  access interface name{
 ret-type method-name1(param-list);
 ret-type method-name2(param-list);
 type var1=value;
 type var2=value;
 //...
 ret-type method-nameN(param-list);
 type varN=value;
  }
access是公有或不可使用的,当不含访问指示符时,执行默认的访问方式,接口仅对于它所在的包的其他成员可用;当接口被声明为 公有的时,可以被任何其他代码使用(当一个接口被声明为公有的时,必须位于同名的文件中);
  c.方法声明仅仅使用其返回类型和签名,实际上它们是抽象方法,所以,包含接口的每一类都必须实现全部方法,在接口中方法显式声明为公有的;在接口中声明的变量不是实例变量,相反它们被显式声明为public、final和static,并且必须被初始化,故它们实际是常量。
  d.实现接口:要向实现一个接口,需要在类定义中包含implements字句,然后创建由接口定义的方法,一般形式为
   access class classname extends superclass implements interface{//class body}
access是公共的或没有使用,extends语句可选,要向实现多个接口,可以用逗号分开接口;实现接口的方法必须声明为公共的,实现方法的类型签名必须与接口定义中指定的类型签名完全匹配;实现接口的类定义它们自己的附加成员是允许的,且很常见;如果一个类包含一个接口,但没有完全实现那个接口定义的方法,那么该类必须声明为抽象的,这样该类就不能创建对象了,但可以作抽象超类,允许子类提供完整的实现方式。。
  e.使用接口引用:可以声明接口类型的引用变量,这样的变量可以引用实现它的接口的任何对象,当通过一个接口引用调用一个对象上的方法时,将会执行对象实现的方法版本;但接口引用仅仅能够识别其接口所声明的方法,故不能用于访问任何其他变量或者可能由该对象支持的方法。
  f.在接口中可以声明变量,但变量是隐式声明为public、static和final的,在大程序中,常常利用几个常量值来描述数组的大小、各种限制、特殊值等,而大程序通常是由许多独立的源文件组成,这就需要一种方便的方法使得这些常量对每一个文件都可用,在java中接口变量提供了解决方法;要想定义一组共享的常量,不用任何方法就可以方便的创建一个仅仅包含这些的接口,需要访问这些常量的文件只需实现该接口即可。
  g.Java中对应于C++中的头文件和#define语句的是接口和接口变量,要想移植头文件,只需执行一对一的转换即可。
  h.接口可以扩展:通过是由关键词extends,一个接口可以继承另一个接口;扩展接口的语法与继承的语法一样,当一个类实现继承了其他接口的接口时,它必须为在接口继承链中定义的全部方法提供实现方式;任何实现接口的类都必须实现由该接口定义的全部方法,包括从其他接口继承的方法。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值