|
| 1 | +--- |
| 2 | +title: Java语言package |
| 3 | +--- |
| 4 | + |
| 5 | +[TOC] |
| 6 | + |
| 7 | +#包(package) |
| 8 | + |
| 9 | +包(package)是Java提供的文件(即公共类)的组织方式。<br> |
| 10 | +一个包对应一个文件夹,一个包中可以包括许多类文件。<br> |
| 11 | +包中还可以再有子包,称为包等级。 |
| 12 | + |
| 13 | +##包的作用有四个: |
| 14 | + |
| 15 | +- (1) 定位类:具有相似功能的类可以放置在同一个包中,这样可以很容易地查找定位类。 |
| 16 | +- (2) 避免命名冲突:在开发由其他程序员共享的可复用类时,会发生命名冲突,可以把类放在不同包中,通过包名引用类可以避免命名冲突。 |
| 17 | +- (3) 可以方便地分发软件。 |
| 18 | +- (4) 控制类之间的访问 |
| 19 | + |
| 20 | +注意: |
| 21 | + |
| 22 | +- 包是一个类名空间,同一个包中的类和接口不能重名,不同包中的类可以重名。 |
| 23 | +- 根据Java的命名规则,包名均为小写字母。 |
| 24 | +- 类之间的访问控制是通过类修饰符来实现的,若类修饰符为__public__,则表明该类不仅可供同一包中的类访问,也可以被其他包中的类访问。 |
| 25 | +- 若类无修饰符,则表明该类仅供同一包中的类访问。 |
| 26 | +- Java的包等级和Windows的文件组织方式完全相同,只是表示方法不同。 |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +##包的定义 |
| 31 | + |
| 32 | +包的定义就是将源程序文件中的接口和类纳入指定的包。 |
| 33 | + |
| 34 | +一般情况下,Java源程序由四部分组成: |
| 35 | + |
| 36 | +- (1) 一个包(package)定义语句(可选项)。其作用是将本源文件中的接口和类纳入指定包。<br>源文件中若有包说明语句,必须是第一个语句; |
| 37 | +- (2) 若干个(import)语句(可选项)。其作用是引入本源文件中所需要使用的包; |
| 38 | +- (3) 一个__public__的类声明。<br>在一个源文件中只能有一个__public__类; |
| 39 | +- (4) 若干个属于本包的类声明(可选)。 |
| 40 | + |
| 41 | +包的定义语句格式: |
| 42 | + |
| 43 | +>package 包名1[.包名2[.包名3…]]; |
| 44 | +
|
| 45 | +- 创建包就是在当前文件夹下创建一个子文件夹,存放这个包中包含的所有类和接口的.class文件。 |
| 46 | +- 语句中的符号“.”代表了目录分隔符,说明这个语句创建了两个文件夹。 |
| 47 | + |
| 48 | +==习惯上,包名都用小写字母。== |
| 49 | + |
| 50 | +Java规定,如果一个Java文件中有package语句,那么package语句必须写在Java源程序的第一行,该行前只能有空格和注释行。<br> |
| 51 | +Package语句在每个Java源程序中只能有一条,一个类只能属于一个包。 |
| 52 | + |
| 53 | +例如: |
| 54 | + |
| 55 | +~~~java |
| 56 | +package cn.edu.hebiace; |
| 57 | +~~~ |
| 58 | + |
| 59 | +定义了包,语句中的包名分隔符“.”相当于目录分隔符。<br> |
| 60 | +使用package语句指定一个源文件中的类属于一个特定的包。 |
| 61 | + |
| 62 | +Java要求包名与文件系统的目录结构一一对应。<br> |
| 63 | +对于名为cn.edu.hebiace的包,必须创建一个如图所示的目录结构。 |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +若源文件中未使用package语句创建包,则该源文件中的接口和类位于Java的无名包中(无名包又称默认包,指当前目录),会把源文件中的类存储在当前目录(即存放Java源文件的目录)下。 |
| 68 | + |
| 69 | +==无名包中的类不能被其他包中的类引用和复用== |
| 70 | + |
| 71 | + |
| 72 | +##设置类路径 |
| 73 | + |
| 74 | +包是一种组织代码的有效手段,包名指出了程序中需要使用的".class"文件的所在之处。<br> |
| 75 | +另一个能指明".class"文件所在的位置是环境变量CLASSPATH。 |
| 76 | + |
| 77 | +对于Java Application程序,还可以通过为Java解释器设置参数来指定类文件路径。 |
| 78 | + |
| 79 | +例如, |
| 80 | +对于JDK中的Java解释器java.exe,有开关参数-classpath; |
| 81 | + |
| 82 | +假设当需要解释执行的test.class文件不在当前目录而在e盘的TEMP目录下时,可以使用如下的命令行语句: |
| 83 | + |
| 84 | +>java -classpath e:\temp Test |
| 85 | +
|
| 86 | +来运行这个程序 |
| 87 | + |
| 88 | + |
| 89 | +##包的使用 |
| 90 | + |
| 91 | +Java提供了丰富的标准类来帮助程序设计者更方便快捷地编写程序,这些标准类组成了类包,主要有: |
| 92 | + |
| 93 | +- java.lang |
| 94 | +- java.applet |
| 95 | +- java.io |
| 96 | +- java.net |
| 97 | +- java.util |
| 98 | +- java.awt |
| 99 | +- java.awt.image |
| 100 | +- java.awt.peer |
| 101 | + |
| 102 | +使用Swing组件进行GUI设计,使用javax.swing包中的类 |
| 103 | + |
| 104 | +==除了java.lang之外,其余类包都不是java语言所必须的。==<br> |
| 105 | +若要使用,必须进行包的导入。 |
| 106 | + |
| 107 | +将类组织成包的目的是为了更好地利用包中的类。 |
| 108 | +通常一个类只能引用与它在同一个包中的类。 |
| 109 | + |
| 110 | +如果需要使用其它包中的public类,则可以使用如下的几种方法。 |
| 111 | + |
| 112 | +- (1) 在引入的类前加包名<br> |
| 113 | +例如: |
| 114 | + |
| 115 | +~~~java |
| 116 | +pack1.pack2.Format.format(23.4533,2); |
| 117 | +~~~ |
| 118 | + |
| 119 | +- (2) 单类型导入(single-type-import)<br> |
| 120 | +例如上面的语句在程序开始处增加了: |
| 121 | + |
| 122 | +~~~java |
| 123 | +import pack1.pack2.Format; |
| 124 | +~~~ |
| 125 | + |
| 126 | +语句之后,就可以直接写成: |
| 127 | + |
| 128 | +~~~java |
| 129 | +Format.format(23.4533,2); |
| 130 | +~~~ |
| 131 | + |
| 132 | +- (3) 按需类型导入(type-import-on-demand) |
| 133 | + |
| 134 | +~~~java |
| 135 | +import pack1.pack2.*; |
| 136 | +~~~ |
| 137 | + |
| 138 | +##内部类和匿名类 |
| 139 | + |
| 140 | +###内部类 |
| 141 | +一个类被嵌套定义于另一个类中,称为内部类(Inner Classes)或内隐类,包含内部类的类称为外部类。 |
| 142 | + |
| 143 | +外部类与内部类的访问原则是: |
| 144 | + |
| 145 | +- 在外部类中,一般通过一个内部类的对象来访问内部类的成员变量或方法; |
| 146 | +- 在内部类中,可以直接访问外部类的所有成员变量和方法(包括静态成员变量和方法、实例成员变量和方法及私有成员变量和方法)。 |
| 147 | + |
| 148 | +内部类和其他常规类类似,有下列特征: |
| 149 | + |
| 150 | +- (1)Java将内部类作为外部类的一个成员,内部类可以调用包含它的外部类的成员变量和成员方法,所以不必把外部类的引用传递给内部类的构造方法。 |
| 151 | +- (2)内部类的类名只能用在外部类和内部类自身中,内部类的类名不能与外部类的类名相同。当外部类引用内部类时,须给出完整的名称(外部类名.内部类名)。 |
| 152 | +- (3)内部类只是用来支持其外部类的工作,编译后,它的名称形如“外部类名称$内部类名称.class”。 |
| 153 | +- (4)内部类可以声明为public、protected或private,其意义与用在类的其他成员上相同。 |
| 154 | + |
| 155 | +和普通的类一样,内部类也可以有静态的。<br> |
| 156 | +__static__型内部类只能访问外部类中的__static__成员。<br> |
| 157 | +若要访问非static成员,须先创建一个外部类对象,然后通过该对象进行访问。 |
| 158 | + |
| 159 | + |
| 160 | +###匿名类 |
| 161 | + |
| 162 | +有时在定义事件处理代码时,由于代码短小,不必再明确定义一个类,可使用匿名内部类。 |
| 163 | + |
| 164 | +匿名内部类是__final__(最终)类,非static类,匿名内部类将类的声明和创建类的实例一步完成。 |
| 165 | + |
| 166 | +主要应用在事件处理的代码编写中。 |
| 167 | + |
| 168 | +~~~java |
| 169 | +JButton jb = new JButton("Exit"); |
| 170 | + |
| 171 | +jb.addActionListener(new ActionListener() { |
| 172 | + public void actionPerformed(ActionEvent e) { |
| 173 | + System.exit(-1); |
| 174 | + } |
| 175 | +}; |
| 176 | +~~~ |
| 177 | + |
| 178 | +注意:在使用匿名内部类时,要记住以下几个原则: |
| 179 | + |
| 180 | +- (1)匿名内部类不能有构造方法; |
| 181 | +- (2)匿名内部类不能定义任何静态成员、方法和类。 |
| 182 | +- (3)匿名内部类不能是__public__, __protected__, __private__, __static__。 |
| 183 | +- (4)只能创建匿名内部类的一个实例。<br> |
| 184 | +一个匿名内部类一定是在__new__的后面,用其隐含实现一个接口或实现一个类。<br> |
| 185 | +因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。 |
| 186 | +<br>内部类只能访问外部类的静态变量或静态方法。 |
| 187 | +- (5)当在匿名类中用__this__时,这个__this__则指的是匿名类或内部类本身。<br> |
| 188 | +这时如果要使用外部类的方法和变量,则应该加上外部类的类名 |
| 189 | + |
| 190 | + |
| 191 | + |
| 192 | +##访问控制和类的封装性 |
| 193 | + |
| 194 | +对类的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。 |
| 195 | + |
| 196 | + |
| 197 | + |
| 198 | +注意: |
| 199 | + |
| 200 | +- __private__修饰符只能用来修饰类的数据成员和成员方法,而不能用来修饰类。 |
| 201 | +- 修饰符__private__、 __public__、 __protected__都不能用来修饰方法中的局部变量。 |
| 202 | +在大部分情况下,一个类的构造方法都是__public__的。 |
| 203 | +但是,如果不想创建类的实例,可以定义__private__构造方法。 |
| 204 | + |
| 205 | + |
| 206 | +###类的封装性 |
| 207 | + |
| 208 | +保证模块正确性的措施是由信息的隐藏性来实现的。 |
| 209 | + |
| 210 | +类包括成员变量和方法两部分。 |
| 211 | + |
| 212 | +- 那些允许其他包程序访问和修改的成员变量和方法可以定义为__public__类型; |
| 213 | +- 只允许同一个包中的其他类,以及该类的子类访问和修改的成员变量可以定义为__protected__类型; |
| 214 | +- 不允许其他类(内部类除外)访问和修改的成员变量可以定义为__private__类型。 |
| 215 | + |
| 216 | + |
| 217 | +--- |
| 218 | + |
| 219 | +本文档 Github : |
| 220 | +https://github.com/bushehui/Java_tutorial |
| 221 | + |
| 222 | + |
| 223 | + |
| 224 | + |
| 225 | + |
| 226 | + |
| 227 | + |
| 228 | + |
| 229 | + |
| 230 | + |
| 231 | + |
| 232 | + |
| 233 | + |
| 234 | + |
| 235 | + |
0 commit comments